一些审计方法

对于未公开POC的1day复现,直接看cnvd的提交,我们这里审计梦想CMS 1.4所以直接搜索就行
image-20230828215700457
可以看到很多,虽然文件名未全部显示但是就那几个文件,显示了大部分字母就能找到了,这是复现1day的方法,当然也可以直接拿最新版本审0day

BookAction.class.php下sql注入

这个系统是个MVC架构,emmm不太了解得找时间学学了,不然代审有点难,先来看下这个文件下的注入在reply方法下GET接收一个id
image-20230828215835650
直接跟进getReply看看找到底层的sql语句,最终在db.class.php找到
image-20230828215852668
可以看到直接拼接了field即一开始的id,而且这个整个项目的sql调用都在这个文件,但是这个底层的sql调用没有做预编译,那么你就得在用的时候去写这样就很容易遗漏出现sql注入,在这里打印一下sql语句方便调试,来到这个BookAction.class.php文件下进入reply方法传个id
image-20230828215908038
直接闭合一下,这里得用)闭合,从sql语句即可看出,然后用报错注入注一下版本,payload如下

1
id=1) or updatexml(0,concat(0x7e,version()),1)#

url编码一下注入
image-20230828215920773
注入成功,后台的注入虽然简单,但是危害不大,没有弱口令进入后台的话就无法利用,下面看看前台的sql注入,因为sql注入基本上就是在前台注拿到后台的密码

TagsAction.class.php下的sql注入

来到前台index下的TagsAction.class.php文件,这个文件下没有获取参数的方法,但是这里他自己写了个p函数用来获取,并且对sql注入进行了一下处理
image-20230828215936884
可以看到select和from都过滤了,从里面绕是很困难的,就想办法从外部绕,这里为了防页面跳转直接在burp上抓包看,照样去到底部的sql调用打印一下sql语句
image-20230828215956904
正常注入的话是会被过滤转义的,但是看代码在过了p函数后进入sql语句执行前有个url解码
image-20230828220011827
emmm,ctf的感觉,搁这儿出题呢?那么二次编码即可,payload如下

1
?m=tags&name=%25%33%31%25%32%37%25%32%30%25%36%66%25%37%32%25%32%30%25%37%35%25%37%30%25%36%34%25%36%31%25%37%34%25%36%35%25%37%38%25%36%64%25%36%63%25%32%38%25%33%30%25%32%63%25%36%33%25%36%66%25%36%65%25%36%33%25%36%31%25%37%34%25%32%38%25%33%30%25%37%38%25%33%37%25%36%35%25%32%63%25%37%36%25%36%35%25%37%32%25%37%33%25%36%39%25%36%66%25%36%65%25%32%38%25%32%39%25%32%39%25%32%63%25%33%31%25%32%39%25%32%33

image-20230828220042515

BookAction.class.php下的sql注入

来到文件下寻找传参
image-20230828220058846
这里调用了add方法,这个方法底层执行了sql,跟进去即可看到
image-20230828220119000
同样输出一下sql语句,然后把访问要的参数加上先看看
image-20230828220142810
访问成功,接下来就去找注入,直接来到底层的sql语句执行的地方看看
image-20230828220157226
发现对这个key没有任何处理直接进行了拼接,来到p函数下看看也没用任何的处理只是对$v操作,包括filter_sql函数
image-20230828220214466
然后改一下key看能不能注入
image-20230828220229390
发现没有报错,这样代表就注入进去了,来到页面看看
image-20230828220253722
刚刚注进去的参数并没有回显出来,只有一些系统默认放的东西,来到数据库里查看表的结构,看看为什么是这样的
image-20230828220311302
可以看到有个ischeck显示为1才会回显,那么设置一下这个key为1
image-20230828220323149
可以看到回显成功,接下来构造payload注入就行

1
setbook=a&name=e&content=b&mail=c&tel=d&time,ischeck)values(version(),2,3,4,5,6,1)#=a

image-20230828220345049

SearchAction.class.php下的注入

这个注入本来没打算写的,因为是盲注且过滤了'和一些关键字,所以很多查询根本用不了,但是如果改了数据库的配置为gbk编码那么可以用宽字节注入来绕过,平时没怎么接触宽字节注入所以来看一下,这个地方的功能其实就是前台的那个搜索
image-20230828220407106
然后看一下源码找到sql语句照样输出看看
image-20230828220424495
在searchCoutn里面一路跟进去就行了,然后可以看到keywords的a被单引号包裹了然后引号又被过滤了就很难用
image-20230828220456144
然后最终找到一个参数tuijian通过报错发现是列名,那么就不存在有单引号什么的
image-20230828220510418
然后注入一下发现它的content-Length变了说明注入成功,在没有注入成功的时候长度是5000多
image-20230828220530071
然后注一下mysql的版本第一位数字,为5注入成功,真要注的话也可以写脚本进行注入
image-20230828220550381
但是这里依旧用不了select等关键字,注不出来很有用的信息,但是这个关键子其实可以绕过,因为在执行了p函数之后有个string::delHtml这个delHtml方法会清除一些html标签如<>所以可以利用这个绕过,之所以上面的注入不用是因为无法绕过单引号,但是如果系统用了GBK编码就可以使用宽字节注入了,当然很少有人去改配置,这个梦想CMS默认是utf8这里为了学习下所以给它改了试试
image-20230828220646802
然后构造报错注入的payload如下

1
a%df')or+upd<>atexml(0,concat(0x7e,us<>er()),1)%23

image-20230828220704108

BackdbAction.class.php下的任意文件删除

删除文件一般都是unlink,所以如果是自己找的话就直接找这个,这里我跟着组长直接找漏洞点了,在BackdbAction.class.php下找到delOne函数
image-20230828220722152
可以看到明显的任意文件删除没有任何的过滤啥的,现在找到filename参数怎么得到,最终是在delbackdb函数下通过GET传参得到
image-20230828220734143
这里它检测的竟然是这个参数不存在的话显示备份文件不存在,而不是真正的文件不存在显示备份文件不存在,现在构造一下payload试一下,首先在网站 根目录建个flag.txt
image-20230828220747353
payload如下,这里需要做一下目录穿越因为filename是拼接在file/back/后面的

1
/admin.php?m=backdb&a=delbackdb&filename=../../flag.txt

image-20230828220802316
成功删除

TemplateAction.class.php下的任意文件读取

这个漏洞在cnvd没有公开文件名的任何字母,也没有说是前台后台,所以做复现相当于告诉你这个系统有这个洞,然后你自己去找,这样其实难度就比较大了
任意文件读取利用的其实就是file_get_contents这个函数,那么就全局搜索这个函数看看哪里调用了,然后一个个审,最终是在file.class.php文件下的getcon函数调用了file_get_contents方法
image-20230828220820339
相当于重写了一下file_get_contents方法,里面也没啥过滤,只是检查了一下权限,然后找哪里调用了getcon方法
image-20230828220833999
就一处调用了在TemplateAction.class.php下的editfile函数中
image-20230828220844602
接收一个dir参数然后拼接在template后面,那么现在就可以构造payload尝试读取一下了

1
/admin.php?m=template&a=editfile&dir=../index.php

image-20230828220859955
成功读取

TemplateAction.class.php下的任意文件写入

就在刚刚那个editfile函数下还存在一个任意文件写入
image-20230828220910054
接收一个settemcontent参数进入if,然后filename,然后文件内容temcontent
image-20230828220923970
然后访问1.php,发现成功写入,这样可以直接getshell了,这个就有点代码审计的意思了,看了下在黑盒下找到还是比较困难
image-20230828220934594

黑盒下的任意文件上传

这个就是黑盒下的文件上传,直接白盒审的话其实比黑盒难
在内容管理下找到一处文件上传的地方
image-20230828220958303
但是由于版本比较老,新版本的edge不支持点击了,如下选择文件和开始上传根本点不了,这里可以用flash来访问,或者自己构造上传包,另外支持的上传格式也可以看到
image-20230828221014803
找找哪里能修改,找到如下位置,将php加上
image-20230828221025557
然后flash访问上传
image-20230828221037936
emmm找了半天路径得把刚刚得图片选择才会显示路径
image-20230828221048958
确定选择之后得到路径
image-20230828221102313
成功上传
image-20230828221135089

TemplateAction.class.php下的任意代码执行

这里也直接黑盒下看吧,比较简单
这个系统用的smarty模板,正好在这个里面存在代码执行,如下
image-20230828221156132
然后访问前台发现成功执行了
image-20230828221211141
另外在AcquisiAction.class.php有代码执行,利用的是eval函数,可以自己跟一下,这个看组长视频没跟了非常绕,并且这个版本也比较老了,等后面来兴趣了我再自己跟吧,这个系统肯定是很多洞的,目前最新版本在41,可以去审一下0day

参考

白日梦组长yyds
https://www.bilibili.com/video/BV1yq4y1s7h6/?spm_id_from=333.999.0.0&vd_source=fdbccecc8d1a39a2449860e47c52b6e7