前言
这是代码审计入门的第三篇,选用了常见的mvc架构的梦想cms进行审计
审计版本:1.40-1.41
梦想cms源码下载地址:http://www.lmxcms.com/down/
ps:前十年1.40版本到前两年1.41版本依旧没有修这个sql
运行环境要求:
可用的 web服务器(如 Apache,nginx,IIS 等)
php<5.6
正文
虽然这次目标很明确,但是我们还是要先分析一下它的路由
我们先来看cms的入口index.php,包含了/inc/run.inc.php,这就是路由了
我们简单看下目录,发现c内有三个文件夹,分别是admin和index和install
RUN_TYPE从字面看是运行环境的意思,在c这个文件夹下翻译过来是分为三个模式,一个是admin(后台),一个是index(前台),一个是install(下载)
这有一个加载类文件的函数,也就是说我们可以在c这个文件夹中加载action
接着是这里,如果RUN_TYPE不等于extend,比如admin,那它就会返回Action类字符串,然后如果有传入m参数,会跳转到参数m目录下,并创建这个类,并运行run函数
我们跟着run方法走!
找到了a参数,而且没有后续了,那分析到此结束,接下来可以开始正式漏洞挖掘了,我们很明确这个是一个后台漏洞,并且我们可以根据cnvd描述所在的文件去挖掘,很明显只有一个TagesAction.class.php,一眼丁真看见个search函数,其中有半个sql的模糊查询语句
这个search参数传入了name然后直接拼接进了where变量,怀疑这个是sql注入,我们跳转到tagsCount方法看看
接着返回了countModel函数
在countModel函数中又返回了countDB函数,在countDB中执行了query,query就是简单的查询函数,所以也就是说从传入参数后到查询语句内,都没有过滤,理论存在sql模糊注入
理论上十拿九稳了,现在进入实战注入检验一下,我们根据刚刚路由分析的结果进入后台admin.php?m=index&a=index将m参数传入Tags,a参数传入search,name参数传入模糊注入的语句
在这里我们根据源码%"闭合,%23注释后面的%"再拼入sql查询语句,就可以进去了捏
payload:?m=Tags&a=search&name=1%"%20and(select%20updatexml(1,concat(0x7e,(select%20group_concat(table_name)from%20information_schema.tables%20where%20table_schema=database())),0x7e))%23 //爆表名
唯一就是有个问题,联合注入的时候注入不出来数据,并且只会返回第一张表和第一个字段名,在查询数据的时候会返回原来的页面,看了源码也没有搞明白,希望师傅们不吝赐教
联合注入
报错注入
这里就放一张图证明一下联合注入的问题,剩下的过程就请各位师傅自己复现啦:)