**AppCMS**
**官网:http://www.appcms.cc/**
**审计版本:2.0.101**
**下载连接:http://www.appcms.cc/download/appcms_2.0.101.zip**
### AppCMS comment.php SQL Injection
### 0x00 前言
一开始是在cnvd()上看到有人提交这个漏洞没有详情,去官网下载源码本地审计没有审计出来;一次偶然的机会看到@Thinking分享的文章,才知道服务器端获取的“HTTP_CLIENT_IP”值是http头中“CLIENT-IP”字段的值是可伪造的!看到这个就恍然大悟了~
### 0x01 分析
本地搭建好环境后,点击任一app拉至最下方进行评论此时用burpsuite抓包如下

看漏洞文件commet.php关键代码27-37行,实例化common类并赋值给变量$c,以$_GET[‘m’]的形式获取传入的值进行函数调用。

而当前进行评论调用的函数是m__add(),在comment.php第56-86行定义

m__add()函数的大意是评论内容不能为空即存在$_POST[‘comment’],正确输入验证码之后将需要的内容存入$fields数组中;在第79行静态调用了helper :: getip()函数跟进下,在core/helper.class.php文件第44-57行定义,通过HTTP_CLIENT_IP来获取客户端的ip即HTTP头中的CLIENT-IP字段。

回到m__add()函数第83行数组$fields的值传入single_insert方法,跟进在core/database.class.php文件第102行至120行定义,将数组$fields的值通过foreach遍历拼接之后带入query_insert方法

继续跟进core/database.class.php文件第73-83行,进行了SQL查询;$fields[‘ip’]未经过滤导致SQL注入

### 0x02 利用
通过CLIENT-IP引入单引号提交发现并没有报错,如下

看看SQL查询流程,query_insert方法中将mysql错误信息写入$querys[‘error’]中,一路return

在m__add()函数第84行,如果存在$ress['error']且不为空就输出”发表失败”并输出mysql报错信息

不知道为什么这个点不会mysql报错,那么换一种方式回显方式伪造CLIENT-IP:
CLIENT-IP: 1.1.1.1'),('2','0','0',(select user()),'kzaopa','1512573725','2.2.2.2')#
提交后回到浏览器刷新

这里有点需要注意('2','0','0', 这里的“2“要与浏览器中id=x的x相等,不然找不到回显的内容。

暂无评论