SQL注入基础小总结
基本知识
注入点
客户端能发送恶意sql代码的地方
注入原理
攻击者在请求中输入了恶意sql代码,但web服务器、数据库服务器并没有做过滤处理,使攻击者从客户端查询到数据库非管理员不应该被看见或操作的东西
sql注入流程
求闭合字符、选择注入模式、爆数据库、爆表名、爆列名、爆字段名
常见注入方式分类
1.数字型注入
通过改变数字型条件判断是否有注入点,如?id= x and 1=1回显正确;?id= x and 1=2回显错误;
2.字符型注入
常见于登陆页面或页面有"?username=xxx/?password=xxx",通过闭合符和注释符配合绕过用户名和密码,直接获取数据库里的账号信息,如?id= x' and '1'='1回显正确;?id= x' and '1'='2回显错误;
注入的分类
- 布尔注入:根据返回页面判断条件真假
- 联合注入:使用union注入
- 延时注入:不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句进行执行来判断
- 报错注入:页面返回错误信息或将注入的语句的结果直接返回页面中
堆叠查询
多条sql语句同时执行;如果源码语句是Mysqli_query,则堆叠语句是无效的
文件读写操作
Load_file()
读取函数 àunion select 1,load_file(‘路径’),3
Into outfile
导出函数 àselect ‘内容’ into outfile ‘/路径/文件名’【文件名或路径获得:报错显示、文件遗留、漏洞报错、平台配置文件、爆破、php的script_filename(php文件的绝对地址,返回php完整路径)】
其他注入方式
1. 加解密:将要注入的语句进行加解密再注入
2. 二次注入:将写好的攻击语句发送至后端,通过二次操作触发二次攻击语句(即有前提条件)
3. DNS注入:需要对方注入点是高权限,涉及文件读写;将结果发送到DNS解析网站中
防注入手段:
1. 魔术引号(magic_quotes_gpc=on时已启用):将单引号、双引号、反斜杠和NULL全部转义(PHP版本小于5.4)
2. 内置函数:is_int等,判断是否是目标类型的函数【如果是后端判断则很难绕过】
3. 自定义关键字
4. Waf防护软件
盲注
注入过程中,执行select之后,可能由于网站代码的限制或者apache等解析器配置了不回显数据,造成在select数据之后不能回显到前端页面,此时需要利用一些方法进行判断或者尝试的过程叫做盲注,简单的说就是构造一个判断条件来逐步猜解完整的数据信息
布尔盲注
根据返回的true和false,判断是否和自己输入值一致从而猜解出完整的数据
length函数:
用于计算sql中字段的长度;一个汉字是三个字符,一个数字是一个字符
substr()函数
substr(database(),1,1) 第一个1表示从第几个字符开始,第二个1表示输出几个字符
ascii()函数
将函数内的内容转为ASCII码值
时间盲注
返回值只有一个true,不论输入何值返回情况都按正常处理,加入特定时间函数,通过web页面返回时间差来判断注入语句是否正确
sleep函数:sleep()
返回时间是否和sleep设置的值相同或相近,满足则是正确;反之则是错误
if函数:if(expr1,expr2,expr3)
条件expr1为真,则返回expr2;条件expr1为假,则返回expr3;猜的方式【二分法:取值为1-100】
报错注入
页面没有显示位,但需要输出SQL语句执行错误信息
floor报错注入
利用count()函数、rand()函数、floor函数以及group by这几个特定函数结合在一起产生的漏洞,缺一不可
select * from users where id=1 and (select 1 from (select count(*),concat(user(),floor(rand(0)*2)) x from information_schema.tables group by x) a);
count(*)函数
返回表中的记录数,相当于一个计数器,记录涉及了多少个数
floor()函数
返回小于等于该值的最大整数(即向下取整)
concat()函数
字符串拼接,报错注入中,将需要获得的数据库内容拼接,报错时作为回显内容
rand()和rand(0)函数【此报错注入关键】
产生0-1之间的随机数;根据不同的参数,生成不同的参数{但相同参数生成相同随机数,故使用0固定参数生成范围}
group by a
根据a的规则对数据进行分组,分组时,sql会建立一个临时空表进行分组;并且分组时,值不存在则会插入key(即key+1);有无值count计数器都会+1
floor(rand(0)*2) from users
根据用户表,返回值为随机返回,由于rand()是产生0-1之间的随机数,*2后则产生0-2达到随机数
select count(*),(user(),floor(rand(0)*2))x from table group by x;
group by 主键冲突报错时会在报错信息中返回key和查询的内容;将查询结果传递给x,然后使用group by x进行分组,最终报错输出查询结果
语句外的a表示给临时表取的名字叫a
爆表名时,涉及到多个表名字,需要在select table_name from information_schema.tables where table_schema=database()后添加limit限制语句
extractvalue报错注入
extractvalue(XML_document,XPath_string)
XML_document--目标xml文档,字符串格式
XPath_string--xml路径
xml文档中查找字符位置是用 /xxx/xxx/xxx/...类似linux找文件,如果写入其他格式则会报错,并返回写入的非法格式内容
注入格式
?id=1'union select extractvalue(1,concat(0x7e,database(),0x7e)) --+
同上,爆表名和列名需要添加括号以及limit限制语句
updatexml()报错注入
与extractvalue()类似--updatexml(XML_document,XPath_string,new_value)
new_value是更新的内容,前两个和extractvalue一样
格式
?id=1'union select updatexml(1,concat(0x7e,database(),0x7e),3) --+
exp报错注入
exp是以e为底数的指数函数,也就是e的幂
当此函数数值太大,会产生溢出【具体在参数大于709时】,此时将0按位取反就会返回最大的无符号数
按位取反:二进制每一位取反
按位取反符:~
有符号范围:-9223372036854775808-9223372036854775807
无符号范围:0-18446744073709551615
通过嵌套查询和按位取反,造成double overflow error,借此注入数据
sql语句格式
select exp(~(select*from(select user())x));
利用burpsuite实现注入
POST注入
输入用户名和密码,确认之后burpsuite会自动弹出,最后一行会显示username&passwd&submit;此时在当前页面右键,send to repeater
repeater是一个手动操作单独补发http请求并分析应用程序相应的工具
对passwd进行修改,加入转义字符\,send之后pretty出现报错内容;此时在passwd=123456后注入语句,' or 1=1 --+回显正确内容(同get的注入)
POST盲注【此情况报错和成功只显示../img不显示具体错误,flag成功/slap失败】
布尔盲注
注入语句到uname不是passwd
延时盲注
同上
burpsuite进行http注入
user-agent注入
修改user-agent参数,正常情况不会有回显信息;注入语句
referer注入
报错注入
'and updatexml(1,concat(0x7e,(database()),0x7e),1) and '1'='1
盲注
注入'or(length(database()))=9 or if(1=1,sleep(3),null) or '1'='1
Cookie注入
同上面burpsuite注入
以上三个方法都需要前面学习的报错和盲注
总结可能不够全面,还请多包含!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix