代码审计-PHP专题MVC开发控制视图URL路由文件定位SQL注入文件安全1day分析
//MVC源码架构
index.php/content/id/1
index.php?m=list&a=index&classid=11
-MVC流程:
1、Controller截获用户发出的请求;
2、Controller调用Model完成状态的读写操作;
3、Controller把数据传递给View;
4、View渲染最终结果并呈献给用户。
-MVC各层职能:
1、控制器Controller层–负责响应用户请求、准备数据,及如何展示数据。
2、模块Model层–管理业务逻辑和数据库逻辑,提供连接操作数据库的抽象层。
3、视图View层–负责前端模版渲染数据,通过HTML方式呈现给用户。
-MVC对审计主要影响:
1、文件代码定位问题
2、代码过滤分析问题
3、前端安全发现问题
PHP常见漏洞关键字:
SQL注入:
select insert update mysql_query mysqli等
文件上传:
$_FILES,type="file",上传,move_uploaded_file()等
XSS跨站:
print print_r echo sprintf die var_dump var_export等
文件包含:
include include_once require require_once等
代码执行:
eval assert preg_replace call_user_func call_user_func_array
命令执行:
system exec shell_exec `` passthru pcntl_exec popen proc_open等
变量覆盖:
extract()parse_str()importrequestvariables() $$ 等
反序列化:
serialize()unserialize() __construct __destruct等
其他漏洞:
unlink()file_get_contents()show_source()file()fopen()等
通用关键字:
$_GET,$_POST,$_REQUEST,$_FILES,$_SERVER等
注释关键字:
通过开发者对代码的优化注释搜索功能代码段
MVC开发审计入口常见方法:
-搜索法:常规或部分MVC模型源码可以采用关键字的搜索挖掘思路
-功能法:框架MVC模型源码一般会采用功能点分析抓包追踪挖掘思路
-对比法:可以通过前后修复版本文件及代码不同特征进行针对挖掘思路
-特征法:数据库监控挖SQL注入,文件监控挖上传删除写入等,后续补充
-工具法:后续讲到(IASTDASTSASTAI项目等)
-调试法:动态插桩调试
MVC开发审计流程方法:
1、搞清URL路由对应(逻辑代码,静态页面等)
路由逻辑就是c文件下index目录下的List文件
http://127.0.0.1:85/index.php?m=list&a=index&classid=5
?m=list
ListAction.class.php文件
a=index
index目录
classid=5
就是这里的魔术方法
为了验证我们的猜想,我们在List文件下输出一个123,再看一下页面
2、搞清核心配置文件(提交接受,全局过滤等)
3、搞清是否为开发框架(ThinkPHP,Yii等)
LmxCMS MVC SQL注入
https://www.cnvd.org.cn/flaw/show/CNVD-2023-98192
https://www.cnvd.org.cn/flaw/show/CNVD-2019-05674
利用方式:Payload (URL编码两次,借助解码绕过)
绕过思路:name-->url解码-->filter_sql-->url解码
也就是说我们传入两层url加密代码,传入name后进行urldecode解码,然后传入filter_sql进行过滤,但是这里我们是一层url加密代码,然后在进行url解码从而造成sql注入
漏洞关键点在于这个p函数,这里将p传入$data,然后下面把name传入$data再传给$name。
再追踪一下这个p函数,看到这里有一个$mysql_retain
是过滤
但是我们目前没找到sql查询,我们再看其他函数
这里一个getNameDate方法,看起来像一个查询语句,控制where =name这里,在看其他方法
就在这下面有一个oneModel,我们在追踪看一下
我们再点击下面的oneDB,找到了sql查询语句
所以这里既找到了sql注入,也找到了可控变量
但是我们在前面找到了sql过滤,所以我们正常没办法进行注入的,但是有一个方法是关键
这个urldecode就是关键
我们先将payload加上去,然后再看一下,有报错提示
这里我们把payload进行url编码然后再进行url编码即可成功攻击,这里的关键在于我们url编码一次我们浏览器会自动解析一次,就成了普通没有编码的payload,但是我们注意到代码中有一个urldecode,也就是说他会再次进行url解码,所以我们加密两次,我们的代码就注入进去了
Payload:1' and updatexml(0,concat(0x7e,user()),1)#
完整Payload:/index.php?m=Tags&name=%2531%2527%2520%2561%256e%2564%2520%2575%2570%2564%2561%2574%2565%2578%256d%256c%2528%2530%252c%2563%256f%256e%2563%2561%2574%2528%2530%2578%2537%2565%252c%2575%2573%2565%2572%2528%2529%2529%252c%2531%2529%2523
LmxCMS MVC 文件安全
https://www.cnvd.org.cn/flaw/show/CNVD-2020-59469
1、搜索:
删除(unlink)->delbackdb#delOne()->BackdbAction.class.php
2、功能:
备份数据删除->delbackdb#delOne()->BackdbAction.class.php
admin.php?m=backdb&a=delbackdb&filename=../../1.txt
追踪一下就能找到这里
这里我们新建一个1.txt,尝试删除
成功删除
Rockoa MVC SQL注入(1)
参考文章:https://xz.aliyun.com/news/18185
安装搭建:http://www.rockoa.com/view_anzz.html
URL:a是方法 m是目录如果有多层目录则d是最外层目录 m由文件名|目录
路由地址:
http://127.0.0.1:85/index.php?a=check&m=login&d=&ajaxbool=true&rnd=360870
a代表方法、m代表目录、d是最外层
找到了这里
再看一眼表单数据
就是这里了,确定了url路由我们找sql注入的入口
入口就是opendkq这个文件下的insert方法
然后再追踪一下就能发现是sql语句相关的
代码审计:
既然我们找到了这个sql注入的入口,那我们就找一下谁引用了这个方法
在这里我们找到了谁引用了这个方法
这里可以看到是senddata方法引用了这个addkqjs这个方法
或者可以再看谁又引用了senddata这个方法,但是这里这个方法是私有方法,原本是想直接通过路由查找,所以我们继续查找谁引用了这个方法
这里能看到,有一个公共方法引用了这个senddata
这里我们也能看到type默认为9,刚好符合if后面的语句,因此我们就可以传入$sn的值即可
insert->opendkqAction.php->addkqjs()->senddata()->zktimeAction()
/task/openapi/opendkqAction.php文件下的zktimeAction方法
POST /index.php?m=opendkq|openapi&d=task&a=zktime HTTP/1.1
POST /index.php?m=opendkq|openapi&d=task&a=zktime HTTP/1.1
Host: 192.168.1.4:89
这里就存在延迟注入
{"xxx":{"sn":"123'andsleep(0)#"}}
Rockoa MVC SQL注入(2)
安装搭建:http://www.rockoa.com/view_anzz.html
URL:a是方法 m是目录如果有多层目录则d是最外层目录 m由文件名|目录
select->getuserid()->querydataAction()->openbaseAction.php
/task/openapi/openbaseAction.php文件下的querydata方法
这里getuserid使用来源在openbaseAction.php这个文件里面
这里getuserid控制$adminid,$adminid从baseoptid来的,并且basemodenum不能为空,才能进入到$uid
我们的攻击语句就是baseoptid
路由地址
POST /index.php?m=openbase|openapi&d=task&a=querydata HTTP/1.1
{"baseoptid":"1","basemodenum":"xxx' OR SLEEP(0.04)#"}