PHP-Audit-Labs 总结

Day 1 in_array()弱类型绕过

说到底是个弱类型比较的问题,比如

$whitelist = array(0,1,2,3,4,5);
if (!in_array($id, $whitelist)) {
    die("id $id is not in whitelist.");
}

只要第一位是数字就可以绕过

Day 2 url绕过

filter_var($url, FILTER_VALIDATE_URL)parse_url()绕过
一些payload

demo://evil.com:80;sec-redclub.com:80/
demo://evil.com:80,sec-redclub.com:80/
http://localhost/index.php?url=http://demo.com@sec-redclub.com
http://localhost/index.php?url=http://demo.com&sec-redclub.com
http://localhost/index.php?url=http://demo.com?sec-redclub.com
http://localhost/index.php?url=http://demo.com/sec-redclub.com
http://localhost/index.php?url=demo://demo.com,sec-redclub.com
http://localhost/index.php?url=demo://demo.com:80;sec-redclub.com:80/
http://localhost/index.php?url=http://demo.com%23sec-redclub.com

Day 3 内置类SimpleXMLElement实现xxe

https://www.php.net/manual/zh/class.simplexmlelement.php

当可以实例化任意类时可以考虑这种方法,主要看SimpleXMLElement的构造方法

  • data,直接传入xml字符串。也可以传入外部xml的url,前提是第三个参数data_is_urltrue
  • options,都是定义的常量,一般填个2就够了
  • data_is_url默认false

PS:xml里面一定要有文档元素,也就是最后引用的那一部分<foo>&xxe;</foo>,不然会报错

Day 4 strpos弱类型绕过

不是strpos本身的问题,比如

if(!strpos($user,'<')){
    echo "ok";
}

当没有找到时返回false,否则返回下标,如果要找的字符在第一个,下标为0,此时如果进行的是弱类型判断的话,就会有问题

Day 5 escapeshellarg和escapeshellcmd同时使用绕过

escapeshellarg,将给字符串增加一个单引号并且能引用或者转码任何已经存在的单引号
escapeshellcmd,会对以下的字符进行转义&#;|*?~<>^()[]{}$, x0AxFF, '"仅在不配对的时候被转义。

127.0.0.1' -v -d a=1
#escapeshellarg
'127.0.0.1'\'' -v -d a=1'
#escapeshellcmd
'127.0.0.1'\\'' -v -d a=1\'

Day 6 正则表达式及弱类型比较

没什么内容。
顺便提一下正则表达式支持unicode和十六进制,比如\x{0069}就是i
弱类型比较的时候可能用到

# "42" == password
password=42.00e+00000
password=420.00000e-1

正则表达式配置不当写shell的问题可以看p神的文章经典写配置漏洞与几种变形

Day 7 parse_str变量覆盖

extract$$一个道理

Day 8 无数字字母shell

学到个新姿势CTF题目思考--极限利用
在Linux系统中,是支持正则的,某些你忘记某个字符情况下,你可以使用?*%等字符来替代,当然这里想要执行命令,需要极限的利用这个方法

/???/??? => /bin/cat
$_=`/???/???%20/???/???/????/?????.???`;?><?=$_?>
"/bin/cat /var/www/html/index.php"

Day 9 str_replace

简单置空可以双写绕过应该人尽皆知
顺便记一下
addslashes作用对象包括:

  • 单引号'
  • 双引号"
  • 反斜线\
  • 空字节%00

htmlentities

Array
(
    ["] => &quot;
    [&] => &amp;
    [<] => &lt;
    [>] => &gt;
)

Day 10 检测到非法字符未直接退出

之前审计zzcms的时候也发现了这个问题最新ZZCMS代码审计初探
顺便说一下,练习里面这个过滤也有问题,先检测黑名单再strip_tags,只要传sle<br>ep就行了

Day 11 反序列化及__wakeup绕过

老生常谈了

Day 12 htmlentities使用不当

htmlentities() 并不能转换所有的特殊字符,是转换除了空格之外的特殊字符,且单引号和双引号需要单独控制(通过第二个参数)
ENT_COMPAT(默认值):只转换双引号。
ENT_QUOTES:两种引号都转换。
ENT_NOQUOTES:两种引号都不转换。

$_POST$_GET中存在相同的键时,$_REQUEST默认优先取$_POST中的
$_REQUEST$_GET默认会进行urldecode

Day 13

对于传入的非法的$_GET数组键名,PHP会将他们替换成_,包括
+.[

当我们使用HPP(HTTP参数污染)传入多个相同参数给服务器时,PHP只会接收到后者的值

Day 16

$_REQUEST中的数据,是$_GET$_POST$_COOKIE的合集,而且数据是复制过去的,并不是引用

posted @ 2020-08-12 21:33  MustaphaMond  阅读(626)  评论(0编辑  收藏  举报