SQL注入入门实例讲解(NewsCenter
今天写了个sql注入的题目(也是跟着教程做的hhh),过程中有些心得体会,想着写篇博客总结一下。
笔者也是初学者,如有哪里讲错了,欢迎大佬在评论区点出
题目来源:攻防世界web进阶区,NewsCenter
大概是个新闻网站,一进去长这样,提供搜索功能。
先试试单写一个引号 '
没有报错,显示一片空白,应该是叫有回显?
接下来需要知道这个网站查询的格式,是一次查询几个列,有了格式我们才可以继续构造接下来的语句。
这里使用' union select 1,2 #这个语句
解释这个语句:
因为网站调用数据库使用的语句,大概长这样: select '你填的搜索词' from blabla…………
然后我们的语句开头那个引号 ' 注释掉了语句中前面那个引号,用union来执行我们需要的语句,执行完后用#或者 -- 来注释掉原来的语句后面的部分(#和 -- 是mysql的注释方式,注意 -- 最后需要多一格空格在杠后面。)
而select直接加常数查询,会返回一个临时的表,表里就是查询的常数。
比如使用语句select 1,2,3;,数据库就会临时新建一个表,列分别是1,2,3
大概长这样
不一定要是顺序的1,2,3,也可以是2,52,13,24这样的
通过这样简单的查询,我们就可以知道网站每次查询几个参数。(新闻名字,新闻内容,还有一个不太清楚)
这个参数不一定是会显示在网页上的,也可能是后台需要使用的,比如新闻的位置之类的
这里通过尝试,(从一个参数开始,一个一个试),发现网站是使用三个参数查询
可以看出,第一个参数没有显示出来,应该是新闻的位置,第二个参数是新闻的标题,第三个参数是新闻的内容。
至此,可以初步确定查询的格式。
这里还需要讲下mysql这种数据库。这种数据库默认带有一个库叫做information_schema,这个数据库里有带几个表,里面记载了所有的表名和列名,我们可以利用这几个表来得到表和列的名字。
所有表名记在tables表里的table_name列。
而列的名字和存储类型则记载在columns表里的column_name列和column_type列。
然后回到我们这个题目,我们已经知道查询结构了,所以可以通过table表来查这个网站后台的所有表名。
1' union select 1,2,table_name from information_schema.tables #
显示出来表名在新闻内容的位置,新闻的标题都会是2
如果把开头的1去掉,查询内容为全部,就还会显示所有的新闻内容。
这里我们观察表名,发现一派大写名字中,有两个小写的格外突出,一个是news,一个是secret_table。
顾名思义,news里应该存的就是新闻了,secret_table里存的应该就是我们要的
同理,构造语句 1' union select 1,column_type,column_name from information_schema.columns #
但是这样出来的列名和类型是全部表的,所以我们得加上限定条件 where table_name='secret_table'
最终语句: 1' union select 1,column_type,column_name from information_schema.columns where table_name='secret_table' #
查询得到表名和类型,可以看出确实是flag
最后一次查询,直接查询flag
构造语句 1' union select 1,2,fl4g from secret_table #
得到答案
这个题目初学者做着感觉挺有意思,跟着教程也能做,看得懂,就很舒服,推荐大家自己试着做做,一定会有收获的。