PHP-Audit-Labs第一阶段学习总结

天大地大妈咪最大 提交于 2020-02-01 19:01:41


由于篇幅原因,源码详见GITHUB源码链接。同时在这感谢红日安全的分享。因为笔者还是个菜鸡,所以有些地方难免有些错误,请各大佬斧正。同时本篇总结以代码审计为主,部分可能会弱化具体的攻击方法

DAY 1

程序本质 文件上传
漏洞本质 函数缺陷导致的任意文件上传漏洞
缺陷函数 in_array函数
攻击类型 绕过检验

众所周知,php是弱类型语言,当未将in_array函数第三个参数设置为true时,默认进行宽松比较。所以函数在执行搜索项时,会将搜索值强制转换成数字类型。漏洞即在此产生。

攻击:
当我们创建一个文件名首数字为1-24之间的文件。即可通过in_array函数判断,导致任意文件上传漏洞。例:7shell.php

DAY 2

程序本质 用twig模板的点击获得传入链接程序
漏洞本质 函数缺陷导致的xss漏洞
缺陷函数 filter_var函数
攻击类型 绕过检验

程序采取了两种过滤:

  1. Twig模板中的escape过滤。关于过滤详见:Twig中文文档
    这里面有一句话:Internally, escape uses the PHP native htmlspecialchars_ function for the HTML escaping strategy.
    意思是使用htmlspecialchars函数。即转义特殊字符为实体

  2. get传入的值用filter_var函数过滤。 这里设置的参数为FILTER_VALIDATE_URL。即这里判断传入的是否是url。如果成功,返回已过滤的数据,失败返回false。(伪协议可以绕过此过滤)

针对这两种过滤,思路是使用不带特殊字符的xss payload。考虑伪协议绕过

攻击:

payload:?nextSlide=javascript://comment%250aalert(1)

使用js伪协议确保代码无特殊字符不会被转义,且可以绕过filter_var函数的检验。//是单行注释,注释掉后面的内容,再使用%250a——编码%后的%0a,对代码换行。//注释不掉攻击代码,构成xss漏洞,这时只需点击< a > 标签中的链接Next slide即可触发。

DAY 3

程序本质 检测是否存在某种控制器(类)
漏洞本质 用户可以操纵可控变量 / 函数缺陷导致的文件包含漏洞
缺陷函数 class_exists函数
攻击类型 绕过检验

本程序含两个漏洞:

  1. 用户可以操纵可控变量
    很不幸,在本程序中,实例化类的类名,与参数均在用户的控制中。我们可以构造任意危险函数来攻击程序,例如xxe攻击,命令执行攻击(前提是安装了PHP拓展插件expect)
  2. 函数缺陷导致的文件包含漏洞
    class_exists函数在默认情况下,如果程序中含有__autoload函数,会自动加载。很不巧,文件包含漏洞就出现在此了。我们控制类名为路径。即可使用路径穿越包含任意文件。构成文件包含漏洞

DAY 4

程序本质 带过滤的用户登陆
漏洞本质 函数缺陷导致的漏洞
缺陷函数 strpos函数
攻击类型 绕过检验

本程序使用!strpos过滤<>,但是未考虑字符串头字符即为<>的情况。因为此时返回下标0,0和未匹配到false的反均为true。所以我们只需构造payload的字符串首字符为<>即可绕过。

攻击:

payload:username=<"><injected-tag%20property="&pass=<攻击代码>

DAY 5

程序本质 带过滤的邮件发送
漏洞本质 函数缺陷导致的文件包含漏洞
缺陷函数 escapeshellarg、escapeshellcmd函数
攻击类型 绕过检验

代码审计,此程序检验邮件发送的各参数正确。代码先使用filter_var函数确保post传过来的值为邮件。并用escapeshellarg函数,处理特殊字符。看似没有问题。但是此程序存在一个隐含的漏洞。
mail函数的内部是使用了escapeshellcmd函数的,而escapeshellarg函数与escapeshellcmd函数组合,会发生逃逸单引号的问题!

攻击:

payload:=“abc@123.com”,“abc”,“hello world”,"-f aaa@123.com"

escapeshellarg函数与escapeshellcmd函数组合详见超链接

DAY 6

程序本质 创建、删除文件
漏洞本质 正则过滤缺陷导致的目录遍历漏洞
缺陷正则 /[^a-z.-_]/
攻击类型 绕过检验

在删除方法中,使用正则/[^a-z.-_]/,删除文件。即删除除了(a-z字符, .到_的)所有字符,所以这里可以用…/的方法进行路径穿越,删除任意文件

攻击:

payload:action = delete&data = …/…/config.php

DAY 7

程序本质 带登陆验证的连接mysql服务器程序
漏洞本质 函数缺陷导致的变量覆盖漏洞
缺陷函数 parse_str函数
攻击类型 变量覆盖

parse_str函数的第一个参数如果是query string,则会将它解析为变量并设置到当前作用域,实际上,这很像一个注册全局变量的过程。

该程序原本的意思是获取浏览器url并解析url,用一个数组返回其组成部分。调用数组中的query,并解析成变量。但实际上这里被设置为全局变量。我们覆盖mysql的host即可实现变量覆盖,远程连接到我们的数据库中,绕过登陆验证,进行攻击。

攻击:

payload=?config[‘dbhost’]=127.0.0.1&config[‘dbuser]=root&config[‘dbpass’]=root

DAY 8

程序本质 正则过滤变小写
漏洞本质 /e模式修饰符下存在代码执行漏洞
缺陷函数 preg_replace函数
攻击类型 绕过检验

实际上,/e模式修饰符已经被弃用,因为如果设置了这个修饰符,preg_replace函数,会对替换后的字符串,用eval函数的方式,作为php代码评估执行。所以此时很容易存在漏洞。

通过代码审计可知,preg_replace函数的第一个,第三个参数均可控,而第二个参数采用了反向引用的方式,实际也可控。因为strtolower("\1")实际上就是反向引用第一个参数。

攻击:

payload:\S*=${phpinfo()}

即 GET 方式传入的参数名为\S* ,值为 ${phpinfo()}。所以这里会直接eval(phpinfo()),构成代码执行漏洞

preg_replace函数与代码执行详见超链接

DAY 9

程序本质 调用文件
漏洞本质 函数缺陷导致的文件包含漏洞
缺陷函数 str_replace函数
攻击类型 绕过检验

str_replace函数,算老生常谈的话题了,在文件上传等各种情况,如果使用了str_replace函数过滤某个字符串,通过双写字符串即可绕过,进行攻击。算是一种逻辑缺陷的漏洞。

DAY 10

程序本质 辨别pi
漏洞本质 未适当退出程序导致的代码执行漏洞
缺陷思想 在程序完成过滤时,未立即退出
攻击类型 硬刚过滤

当看到extract函数时,我们很容易把它联想到变量覆盖漏洞上。实际上,本程序存在过滤行为,但很可惜的是,过滤处理完成之后,没有立即退出。程序会继续执行。所以我们直接构造简易的payload,即使其被过滤,但未退出,仍然可以执行

攻击:

payload:pi=phpinfo() (post)

DAY 11

程序本质 写入文件
漏洞本质 反序列化漏洞
缺陷思想 变量可控
攻击类型 绕过过滤

审计代码发现unserialize函数的变量可控,所以我们思考两个变量的代码应该如下:
在这里插入图片描述
序列化后的结果:

在这里插入图片描述
但是如何绕过过滤,笔者技术有限,暂未弄懂,在这里直接放出payload,学会了,再来更新
在这里插入图片描述

DAY 12

程序本质 输出一个链接
漏洞本质 函数缺陷导致的xss漏洞
缺陷函数 htmlentities函数
攻击类型 硬刚过滤

跟踪变量,发现其是可控的,虽然其经过htmlentities函数,但是,该函数的特性是,单引号、双引号都需要单独控制第二个参数来实现,所以这里我们直接构造payload,在< a >标签中,执行xss

攻击:

payload:?a’onclick%3d alert(1)%2f %2f=c

DAY 13

程序本质 登陆验证
漏洞本质 特定条件下的字符逃逸
缺陷思想 反斜杠逃逸
攻击类型 绕过检验

审计代码,发现先针对输入的数据用addslashes函数处理,再截取前二十位,所以我们思考,在payload中构造字符串,逃逸反斜杠,使sql语句失效,从而造成绕过,sql注入攻击成功。

攻击:

payload: user=1234567890123456789’&passwd=or 1=1#

1234567890123456789’ 共20位,user传入的时候,被addslashes函数处理,添加\反斜杠,所以此时user的值为21位 1234567890123456789’
被处理时,截断前20位,所以返回的user值为 1234567890123456789\。

此时的sql语句为 select count§ from user where user = '1234567890123456789\ ’ AND password = ‘or 1=1#’

这里的sql语句由于反斜杠的原因,单引号失去作用。user值即为’1234567890123456789\ ’ AND password =’,passwd值为 ‘or 1=1#’
保证了带入数据库查询的结果为TRUE,通过验证。

DAY 14

程序本质 文件写入
漏洞本质 变量覆盖导致的任意路径穿越漏洞
缺陷思想 用户可控变量
攻击类型 变量覆盖

代码审计可知,用户可以直接控制写入函数的位置,通过控制,file_put_contents函数的两个参数,直接导致任意文件写入的问题

攻击:

payload:id=…/var/www/html/shell.php&shell=’,)%0a<?php phpinfo();?>//

DAY 15

程序本质 登陆验证
漏洞本质 缺陷函数导致的网址重定向漏洞
缺陷思想 $_SERVER
攻击类型 绕过检验

$_SERVER[PHP_SELF]获取当前执行脚本的文件名,特别注意:如果PHP以命令行模式运行,这个变量将包含脚本名。所以我们考虑控制变量,可以发生重定向任意网址的漏洞。因为url变量用urldecode函数处理了一次,浏览器本身会解码一次,所以我们构造payload时注意将斜杠url编码两次,这样才能绕过explode函数

攻击:payload:

http://www.test.com/index.php/http:%252f%252fbaidu.com?redirect=123&params=456

DAY 16

程序本质 ftp连接认证
漏洞本质 代码执行
缺陷思想 程序未过滤适当的变量
攻击类型 绕过检验

这里很雷的一个点是,代码处理了get、post、cookie传过来的数据,却未处理request获取的mode变量。并且这里使用==弱比较。所以直接构造payload

攻击:

payload:?mode=1%0a%0dDELETE%20test.file

DAY 17

程序本质 登陆验证
漏洞本质 特定条件下的字符逃逸
缺陷思想 反斜杠逃逸
攻击类型 绕过检验

程序大体与DAY 13相同,不同之处在代码针对用户输入 password 的值调用 md5 函数进行相关处理。并且这里设置第二个参数的值为true。那么此时,MD5报文摘要将以16字节长度的原始二进制格式返回。思路与DAY 13相同,构造payload最后一位为\,使单引号失效。
通过对1-1000fuzz发现,md5(128,true)的结果带有反斜杠。

攻击:

payload:user = OR 1=1#&passwd=128

总结

  • 总结缺陷函数,在审计代码时,可以通过缺陷函数思考有无对应攻击
  • 基础不够夯实,有些程序还无法理解作用
  • 通过可控变量实现xml攻击的payload还不会写,会进一步学习
  • 对于一些绕过检测,可以通过burpsuite,fuzz跑一下,看返回值不同,先确立答案。然后再求解
  • 第一次写技术分享类博客,很多写的不好的地方,希望继续加强。
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!