前言官方文档:php.netphp官方文档,内容很详细,很好用。遇到功能不清楚的可以查询白盒测试。做代码审计最重要的知识是了解一个漏洞应该有什么防御方法,因为大部分的漏洞都是由于没有进行全面的修复,或者修复没有考虑到一些情况导致的漏洞。MVC:C:分发和处理请求网站的逻辑M:处理和数据库相关的操作V:显示给用户的内容代码审计过程正向查找过程a.从入口点函数(如index.php)开始b.找到controller,了解URL分发规则(URL映射到哪个具体代码)c.跟踪控制器调用,以理解代码为目标阅读源代码d.最后,在阅读代码的过程中试图找出漏洞的本质:程序中人员疏忽或逻辑问题导致的漏洞特点:复杂:需要极其熟悉目标源代码的功能和框架。大跳转:涉及M/V/C/Service/Dao等多级漏洞的组合:通常是多个漏洞的组合,很可能会有一个逻辑相关的漏洞逆向搜索流程a.通过危险函数,回溯可能存在的漏洞1.寻找可控变量2.在传输过程中触发漏洞特点:上下文无关的危险函数,call是一个漏洞代码审计工具,大部分功能都是基于这个原理。双向搜索过程(人工审核为主)略读代码,了解框架(正向过程,如:网站有什么功能,什么样的架构像mvc:它的m在哪里,它在哪里v、c在哪里,用的是什么模板引擎,是否用orm(如果用ORM,sql注入很少见,如果没用,就是手工写的sql语句,可以关注一下有没有sqlvulnerability),etc...)是否有全局过滤机制:是否可以绕过Yes:找到漏洞的触发点(逆向搜索过程,找到危险函数)No:找到未过滤的变量No:那就看怎么绕过了被处理了,具体代码详细分析:寻找遗漏的处理点(比如遗忘或处理错误的地方)完全不处理:可以挖个筛子(很少)3.发现漏洞point,explo是否有坑根it:了解程序执行过程,发现危险逻辑特点:高效:如挖隧道,双向施工,时间减半(无需完全了解网站内部原理和功能)知识面广:你需要同时掌握正向和反向挖掘技巧,并结合所有正向和反向优势SQL注入漏洞挖掘技巧PHP+mysql连接方式:mysql(废弃,但老的还在)mysqliPDOsql注入常用过滤方式:intval:过滤掉用户输入数字后的所有非数字Dropaddslashes:Add\before'toescapemysql_real_escape:和第二个类似,但是会考虑用户输入和mysql编码,避免宽字节注入等问题mysqli_escape_string/mysqli_real_escape_string/mysqli::escape_string(与mysqli一起使用,和前面的函数类似),它们的区别在于会主动添加引号来包裹PDO:quote参数化查询常见的注入过滤器绕过方法:intval:不知道addslashes/mysql_real_escape1。wide字节注入2.数值型sql语句3.找一个字符串转换函数(传入编码字符绕过过滤,后面转换成sql语句)urldecodebase64_decodeiconvjson_decodestripshaslessimple_xml_loadstring比如:传入的id被过滤但是后面有一个一段解码base64的代码,因此我们可以传入'base64编码以绕过mysqli::escape_string//PDO::quote1。宽字节注入参数化查询1.开发者容易找到非sql值的位置缺少输入的HTTP头a.X-Forwarded-Forb。用户代理C.RefererPHP_SELF(访问页面的url名称,但用户可以控制)REQUEST_URI(用户请求的完整路径)文件名$_FILES[][name]php://input(postthreadedcontent)引入单引号的方法(escapecharacters)('number被过滤了,看后面有没有可以介绍的地方)stripslashesbase64_decodeurldecodesubstriconvstr_replace('0','',$sql)xmljson_encodeanyfile使用PHP上传的文件会保存在$_FILESPHP文件下运行函数概要文件包含include/require/include_once/require_once/spl_autoload文件读取file_get_contents/fread/readfile/file/hhighlight_file/show_sourcefilewritefile_put_contents/fwrite/mkdir/fputsfiledeleteunlink/rmdirfileuploadmove_uploaded_file/copy/renamefileupload漏洞文件上传过程:检查文件大小,后缀,类型检查文件内容(如文件头,文件尾等).)提取文件后缀生成新文件名将上传的临时文件复制到新文件名位置文件上传逻辑常见错误只检查文件类型不检查文件后缀文件后缀黑名单有遗漏使用原文件名,导致\0截断(一般不会)前端排查文件包含漏洞,首先明确文件包含漏洞不等于文件读取漏洞危害:文件读取/代码执行常见位置:模板文件名(switchingtemplate)languagefilename(switchinglanguage)常用:查找可以包含的文件Filesused:上传文件,临时文件,session文件,日志文件后缀that无法控制:\0被截断,协议使用PHP5.3.4+限制了包含\0的文件操作函数,基本没有case:MetinfoVersion5.3.10Getshell漏洞可控部分:include$file。'.php';http协议利用:http://xxxx.com/1.php(远程文件包含,一般不设置不能使用)PHP协议利用:zip/phar制作2.php压缩包->2.zip->修改后缀to->2.jpg在服务器上上传2.jpg文件以供重复使用:zip://var/www/upload/head/2.jpg#2.php(#meaningaccesstosub-filesinsidethezip->2.php)文件删除漏洞危害:删除服务器上的任意文件,删除DOS服务器上的安装锁文件,导致目标环境重装重装-》随机重置管理员密码案例。上传新头像会自动删除旧头像,但您可以将已删除的旧头像地址替换为其他地址,导致任意文件删除。执行命令就是执行系统命令(ls),可以在这个网站上查询复制命令的意思代码执行指的是PHP代码执行的本质:用户输入不过滤,拼接成系统命令PHP命令执行函数:systempassthruexecshell_execopen(常见以上5种)proc_openpcntl_execdl很难像命令一样执行。了解如何正确防御命令注入,才能分清PHP命令注入漏洞防御不当:PHP中只有escapeshellcmd和escapeshellatg可以过滤命令参数。首先区分一下这两个函数:escapeshellcmdescapeshellatgescapeshellatg没有问题,但是escapeshellatg只能限制单引号转义'但是有些命令的不常用参数可以任意执行。用户的输入应该放在值中。如果输入直接是键值对,可能会造成漏洞。grep{$query}有一些不常见的命令参数,可能会导致一些意外直接使用|等命令跳出前面的命令实现命令执行修复:grep-i{$query}grep--{$query}XML实体注入漏洞PHPXML解析函数simplexml_load_filesimplexml_load_stringSimpleXMLElementDOMDocumentxml_parse如果找到这些函数,基本上就可以确定了80%的xml实体注入到libxml_disable_entity_loader(true)来禁止加载外部实体,没有xml实体注入到PHP中。PHP中的XXE漏洞逐渐减少,在当前版本中几乎消失,因为PHP的XML操作依赖于libxml库,但在libxml2.9.0+中,xml外部实体解析开关默认是关闭的。可以挖出来,比较简单:暴力搜索,看有没有xml解析功能,然后看是否禁止外部加载,没有输出点。xxe漏洞:有时可能会出现xxe漏洞但页面上不会显示。需要使用blind-xxeBlindXXE原理:使用XML外部实体函数读取文件使用XML外部实体函数发送HTTP请求使用HTTP协议传输文件内容前端漏洞:建议不要主要寻找代码审计中的此类漏洞。黑盒测试可以挖出的漏洞,在代码审计过程中不需要过多关注。百盒测试中可以关注前端漏洞类型:XSS漏洞CSRF漏洞Jsonp劫持漏洞(前三个重点比较多)URL跳转漏洞(不多)点击劫持漏洞(不多)xss寻找XSS白盒测试中的漏洞:常见的保护方法:htmlspecialchars()将用户输入转义为html实体字符(这在当时绝对没有xss)strip_tags()去除字符中的HTML和PHP标签AutomatedFUZZ->Findoutputfunctions(dangerousfunctions)RichtextXSSmining什么是富文本:本质是html,网站给你一个功能很多的网站输入框为什么会出现富文本xss:前两种保护方式要么转义要么直接去掉,但是在某些文章或帖子中,需要提交HTML富文本。如果用以前的方法,那么提交的不是富文本出来的,会影响业务。常见的富文本过滤方式:使用富文本xss过滤器:从黑名单中去除用户输入的恶意标签和属性(很难过滤掉被过滤的标签属性)白名单CSRF白盒测试寻找CSRF漏洞:查看Referer(来自当前域名,可信域名,会被执行)(可以看看正则模式是否全面匹配,比如正则模式匹配到xxx.nte后缀的域名,那么就可以注册一个cxxx.nte域名nametobypass)检查Token(发现跨域漏洞,当你要请求某个网站的跨域内容时,需要先请求该网站是否存在跨域。测试可以发现这三个Jsonp劫持漏洞。找到Jsonp白盒测试中的劫持漏洞:Jsonp介绍:Jsonp是json的一种“使用方式”,允许网页从其他域名(网站)获取信息,即跨域n读取数据;它利用了script标签的src属性不受同源策略影响的特性,使得网页可以获取其他来源动态生成的json数据,因此可以用来跨域读取数据。通俗点说:JSONP利用
