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_url
为true
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
,会对以下的字符进行转义&#;|*?~<>^()[]{}$
, x0A
和 xFF
, '
和 "
仅在不配对的时候被转义。
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
(
["] => "
[&] => &
[<] => <
[>] => >
)
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
的合集,而且数据是复制过去的,并不是引用