新之助
- 关注

回显注入流程: 找注入点、判断列数、查数据
注释符:
#
如果输入点是URL需要使用%23来代替--空格
Low级别:
1.可以看到有一个输入框,输入1后点击Submit提交数据,回显了一个用户的信息
2.接着我们在1后面加上一个单引号'
Payload:1'
页面返回错误,根据错误信息我们可以看出当前参数是被单引号包围的,我们多输了1个单引号就引发了报错说明可能存在sql注入而且是单引号字符型
此时语句可能为:SELECT name FROM table id='1''
3.接着我们进一步测试,构造一个恒真,恒假的语句来判断我们的输入是否影响到了数据库
根据上面猜测的SQL语句,我们的输入位置是被单引号包围的因此我们需要闭合左右两边的单引号
恒真Payload:1' and '1
当然也可以只闭合左边的单引号,注释掉后面的如 1' and 1#
可以看到页面并没有报错,此时SQL语句可能为SELECT name FROM table WHERE id='1' and '1'
语句正确所以并没有报错
接着我们在测试恒假的情况
恒假Payload:1' and '0
可以看到页面无返回了,此时SQL语句可能为SELECT name FROM table WHERE id='1' and '0'
语句正确所以没有报错,但是没有满足条件的所以就返回空
此时可以确定存在SQL注入漏洞,而且是字符型
4.接着根据SQL注入的流程就到了判断列数的时候了,我们还需要在末尾加上注释符
因为当前输入点是一个输入框所以可以直接使用#
接着使用order by n
判断列数
n为任意数字,如果当前表的列数大于等于n则正常回显,如果小于n则会报错,使用二分法
Payload:1' order by 4#
页面报错了说明当前表的列数小于4
此时SQL语句可能为SELECT name FROM table WHERE id='1' order by 4 #
接着我们继续使用3来测试,也有错误
再使用2来测试,可以看到页面回显正常,此时可以确定当前的数据库表有两个字段
5.接着我们union来爆出数据回显点因为存在两个字段,所以我们构造
Payload:1' union select 1,2#
可以看到数据回显点已经出来了,此时就可以使用MySQL的内置函数,和内置初始库来查询数据库的信息了
在回显点位置替换指定的函数或语句即可
6.接着为了显示方便观看,将原来正确的数据修改为错误的,只显示我们的union查询的数据,将1改为-1
并且查一下当前数据库,和版本
Payload:-1' union select database(),version()#
可以看到数据已经在会显点显示了
7.接着我们在查一下dvwa库下的表名
Payload:-1' union select (SELECT table_name FROM information_schema.tables WHERE table_schema='dvwa'),2#
可以看到报错了,说明返回的数据存在多行,此时我们需要使用group_concat()函数将所有数据组合成一条信息返回也可以使用limit n,m来一条一条查询信息
8.这里我们使用group_concat()来组合多条信息为一条返回
Payload:-1' union select (SELECT group_concat(table_name) FROM information_schema.tables WHERE table_schema='dvwa'),2#
可以看到成功返回了当前数据库下所有的表名
Medium级别:
1.来到Medium级别可以看到没有输入框,但是可以提交数据
2.可以提交数据意味着需要发送HTTP请求并且有数据回显,意味着HTTP请求当中一定存在参数,所以关门放Bp,开启浏览器代理,开启Bp,重新提交一次数据,可以看到Bp当中抓到了这个提交数据的请求包,是POST请求并且下面有参数,此时我们鼠标右键,将其发送到Repeater模块
3.在Repeater模块,我们可以对一个数据包进行多次重新提交数据包的操作,以方便我们测试
我们将参数改为id参数改为2,接着点击Send发送数据包,在响应模块中点击Render选项卡
可以看到响应的实际情况,可以看到页面正常回显了2好id的信息
4.接着我们在2后面加一个单引号,发现页面报错,报错信息为'\''
我们的单引号被转义了
此时我们猜测这个参数可能是数字型注入
5.接下来我们直接构造数字型的payload
恒真2 and 3>1
可以看到页面正常的返回了信息
恒假3 and 2=1
页面无返回信息,此时可以确定我们输入的数据影响到了系统原有的SQL语句
存在数字型的注入漏洞
6.根据回显注入的流程,此时就应该判断列数了构造payload为1 order by 3#
报错了,说明该表没有3列
7.接着换成2,页面正常返回说明,存在两个字段
8.接着在查看数据的回显点,为了方便观察,我们将第一个查询的数据显示为空,构造一个不存在的数据
payload:-99 union select 1,2#
此时sql语句可能为,select column from table where id=-99 union select 1,2#
可以看到爆出了数据的回显点,此时就可以在数据回显点上查询数据了
High级别:
1.点击链接跳出输入框,输入1提交后数据正常回显
我们直接输入 1 and 0,页面没有反应,说明不是数字型
2.输入1'
可以看到页面报错了
此时我们猜测我们输入的单引号影响到了原先的SQL语句
3.接着我们使用基于单引号的payload测试
1' and '1
可以看到页面回显正常
4.此时我们直接使用order by来判断列数1' order by 2#
可以看到页面返回正常,说明存在两列
接着在改成 1' order by 3#可以看到又报错了,可以确定存在2列
5.此时我们就可以使用union 查数据了
-1' union select version(),2#
可以看到已经回显了数据库的版本了
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
