【PHP代码审计】Bluecms代码审计
一、前端SQL注入 - ad_js.php
漏洞点在如下位置:没有进行过滤或防护直接拼接sql语句

但是在上面包含文件/include/common.inc.php中,存在对GET、POST、COOKIE使用addslashes 进行的统一过滤
1  | function deep_addslashes($str){  | 
因此,单引号、双引号、反斜杠在get、post、cookie中将被转义。
此时的绕过方式也有很多:
- 使用十六进制编码
 - 此cms使用了gbk编码,通过宽字节来绕过
 
在$db->getone()的底层使用的是mysql_query
1  | function query($sql){  | 
二、insert型SQL注入
在/inlude/common.inc.php 中,发现get、post、cookie 都经过了addslashes 的过滤,作为白盒测试的我们,发现数据库中存储了IP的信息,会不会有存储IP的地方没有经过addslashes 的过滤呢?全局搜索ip

果然,找到一个getip 的函数,顺着往上找
在comment.php中,存在一个insert 的SQL语句,其中使用了getip()函数,

三、用户登陆SQL注入
看用户登陆的user.php的$act == 'index_login'内容,登陆校验在user.fun.php文件中,重点代码如下:
1  | function login($user_name,$pwd){  | 
当我们知道用户名之后,在密码的位置可以使用万能密码进行登陆,这里使用宽字节绕过addslashes 函数
1  | user_name=test&pwd=%df') or 1=1 %23&x=26&y=8  | 

四、文件包含漏洞至Getshell
在user.php的750行中,如:
1  | elseif ($act == 'pay'){  | 
这里post提交的pay 没有进行任何的过滤,则可通过目录穿越和截断实现任意文件包含
如果php版本低于5.3.4且magic_quotes_gpc=off则可以使用%00截断。还可以使用系统文件路径长度限制来进行截断

这里已经包含了根路径下的index.php 文件,现在来包含根路径下的1.txt,使用系统文件路径长度限制来绕过。这里依然有个前提,我看很多博客上面都没有提到系统文件路径长度绕过的限制,导致复现不成功,这里的php版本需要小于5.2.8

这样,我们可以联合图片上传来getshell

找到图片位置进行包含并执行命令

五、任意文件删除
database.php文件中存在该漏洞

很明显,漏洞原因是没有对$file_name做充足的校验
删除前根目录

访问:http://192.168.137.48/bluecms/admin/database.php?act=del&file_name=../../../../../../../../1.txt
删除后根目录

六、存储型XSS
这个有点多,简单分析一处
在user.php新增文章这里

不过这里使用了一个filter_data 函数做了一个过滤
1  | function filter_data($str)  | 
但是这个正则是可以绕过的,如使用img标签
1  | <img src=1 onerror=alert(1)>  | 
七、总结
这个bluecms有博主共计74处漏洞,更多的漏洞就暂时不看了,这里贴上这位博主的文章:Bluecms 1.6 代码审计过程(共计 74 个漏洞)-CSDN博客