梦想CMS 1.4代码审计学习
一些审计方法
对于未公开POC的1day复现,直接看cnvd的提交,我们这里审计梦想CMS 1.4所以直接搜索就行
可以看到很多,虽然文件名未全部显示但是就那几个文件,显示了大部分字母就能找到了,这是复现1day的方法,当然也可以直接拿最新版本审0day
BookAction.class.php下sql注入
这个系统是个MVC架构,emmm不太了解得找时间学学了,不然代审有点难,先来看下这个文件下的注入在reply方法下GET接收一个id
直接跟进getReply看看找到底层的sql语句,最终在db.class.php找到
可以看到直接拼接了field即一开始的id,而且这个整个项目的sql调用都在这个文件,但是这个底层的sql调用没有做预编译,那么你就得在用的时候去写这样就很容易遗漏出现sql注入,在这里打印一下sql语句方便调试,来到这个BookAction.class.php文件下进入reply方法传个id
直接闭合一下,这里得用)
闭合,从sql语句即可看出,然后用报错注入注一下版本,payload如下
1 | id=1) or updatexml(0,concat(0x7e,version()),1)# |
url编码一下注入
注入成功,后台的注入虽然简单,但是危害不大,没有弱口令进入后台的话就无法利用,下面看看前台的sql注入,因为sql注入基本上就是在前台注拿到后台的密码
TagsAction.class.php下的sql注入
来到前台index下的TagsAction.class.php文件,这个文件下没有获取参数的方法,但是这里他自己写了个p函数用来获取,并且对sql注入进行了一下处理
可以看到select和from都过滤了,从里面绕是很困难的,就想办法从外部绕,这里为了防页面跳转直接在burp上抓包看,照样去到底部的sql调用打印一下sql语句
正常注入的话是会被过滤转义的,但是看代码在过了p函数后进入sql语句执行前有个url解码
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 |
BookAction.class.php下的sql注入
来到文件下寻找传参
这里调用了add方法,这个方法底层执行了sql,跟进去即可看到
同样输出一下sql语句,然后把访问要的参数加上先看看
访问成功,接下来就去找注入,直接来到底层的sql语句执行的地方看看
发现对这个key没有任何处理直接进行了拼接,来到p函数下看看也没用任何的处理只是对$v
操作,包括filter_sql
函数
然后改一下key看能不能注入
发现没有报错,这样代表就注入进去了,来到页面看看
刚刚注进去的参数并没有回显出来,只有一些系统默认放的东西,来到数据库里查看表的结构,看看为什么是这样的
可以看到有个ischeck显示为1才会回显,那么设置一下这个key为1
可以看到回显成功,接下来构造payload注入就行
1 | setbook=a&name=e&content=b&mail=c&tel=d&time,ischeck)values(version(),2,3,4,5,6,1)#=a |
SearchAction.class.php下的注入
这个注入本来没打算写的,因为是盲注且过滤了'
和一些关键字,所以很多查询根本用不了,但是如果改了数据库的配置为gbk编码那么可以用宽字节注入来绕过,平时没怎么接触宽字节注入所以来看一下,这个地方的功能其实就是前台的那个搜索
然后看一下源码找到sql语句照样输出看看
在searchCoutn里面一路跟进去就行了,然后可以看到keywords的a被单引号包裹了然后引号又被过滤了就很难用
然后最终找到一个参数tuijian通过报错发现是列名,那么就不存在有单引号什么的
然后注入一下发现它的content-Length变了说明注入成功,在没有注入成功的时候长度是5000多
然后注一下mysql的版本第一位数字,为5注入成功,真要注的话也可以写脚本进行注入
但是这里依旧用不了select等关键字,注不出来很有用的信息,但是这个关键子其实可以绕过,因为在执行了p函数之后有个string::delHtml
这个delHtml
方法会清除一些html标签如<>
所以可以利用这个绕过,之所以上面的注入不用是因为无法绕过单引号,但是如果系统用了GBK编码就可以使用宽字节注入了,当然很少有人去改配置,这个梦想CMS默认是utf8这里为了学习下所以给它改了试试
然后构造报错注入的payload如下
1 | a%df')or+upd<>atexml(0,concat(0x7e,us<>er()),1)%23 |
BackdbAction.class.php下的任意文件删除
删除文件一般都是unlink,所以如果是自己找的话就直接找这个,这里我跟着组长直接找漏洞点了,在BackdbAction.class.php下找到delOne函数
可以看到明显的任意文件删除没有任何的过滤啥的,现在找到filename参数怎么得到,最终是在delbackdb函数下通过GET传参得到
这里它检测的竟然是这个参数不存在的话显示备份文件不存在,而不是真正的文件不存在显示备份文件不存在,现在构造一下payload试一下,首先在网站 根目录建个flag.txt
payload如下,这里需要做一下目录穿越因为filename是拼接在file/back/后面的
1 | /admin.php?m=backdb&a=delbackdb&filename=../../flag.txt |
成功删除
TemplateAction.class.php下的任意文件读取
这个漏洞在cnvd没有公开文件名的任何字母,也没有说是前台后台,所以做复现相当于告诉你这个系统有这个洞,然后你自己去找,这样其实难度就比较大了
任意文件读取利用的其实就是file_get_contents
这个函数,那么就全局搜索这个函数看看哪里调用了,然后一个个审,最终是在file.class.php文件下的getcon
函数调用了file_get_contents
方法
相当于重写了一下file_get_contents
方法,里面也没啥过滤,只是检查了一下权限,然后找哪里调用了getcon
方法
就一处调用了在TemplateAction.class.php下的editfile
函数中
接收一个dir参数然后拼接在template后面,那么现在就可以构造payload尝试读取一下了
1 | /admin.php?m=template&a=editfile&dir=../index.php |
成功读取
TemplateAction.class.php下的任意文件写入
就在刚刚那个editfile
函数下还存在一个任意文件写入
接收一个settemcontent参数进入if,然后filename,然后文件内容temcontent
然后访问1.php,发现成功写入,这样可以直接getshell了,这个就有点代码审计的意思了,看了下在黑盒下找到还是比较困难
黑盒下的任意文件上传
这个就是黑盒下的文件上传,直接白盒审的话其实比黑盒难
在内容管理下找到一处文件上传的地方
但是由于版本比较老,新版本的edge不支持点击了,如下选择文件和开始上传根本点不了,这里可以用flash来访问,或者自己构造上传包,另外支持的上传格式也可以看到
找找哪里能修改,找到如下位置,将php加上
然后flash访问上传
emmm找了半天路径得把刚刚得图片选择才会显示路径
确定选择之后得到路径
成功上传
TemplateAction.class.php下的任意代码执行
这里也直接黑盒下看吧,比较简单
这个系统用的smarty模板,正好在这个里面存在代码执行,如下
然后访问前台发现成功执行了
另外在AcquisiAction.class.php有代码执行,利用的是eval函数,可以自己跟一下,这个看组长视频没跟了非常绕,并且这个版本也比较老了,等后面来兴趣了我再自己跟吧,这个系统肯定是很多洞的,目前最新版本在41,可以去审一下0day