SQL注入总结
一.sql注入
原理:当一个网站存在与用户交互的功能(如登录表单、搜索框、评论区等),并且用户输入的数据未经充分过滤或转义,直接拼接到后台数据库查询语句中执行时,就可能引发SQL注入漏洞。攻击者可以通过构造恶意输入,篡改原始SQL语句的逻辑,从而绕过认证、窃取数据、篡改记录甚至完全控制数据库。
sql注入分为数字型注入和字符型注入
数字型的判断语句是
or 1=1 或者 or 1=2
字符型的判断语句要注意的是闭id前面的引号和闭合后面的引号或者注释掉后面的引号。
'1 or'1'='1 或者 '1 or 1=1 --+(#)#号在URL里不能用
当输入1‘时,数字型注入会这样显示,知道是数字型注入后使用数字型 id=1 or 1=1
字符型会这样显示,确认是字符型后输入id=1‘ and ’1‘=’1进行闭合MySQL里的分号
sql注入——union联合查询(当界面有有回显)
UNION
是 SQL 中的一个操作符,用于将两个或多个 SELECT
语句的结果合并成一个结果集。它要求所有 SELECT
语句的列数、数据类型必须一致。
联合查询注入语句构造步骤:
1.用order by + 数字 判断原有语句的列数
2.使原有语句查询为空
3.判断数据输出位置(回显位)
4.使用union 语句拼接目标数据的查询语句
实践
输入1’发现外面有引号包裹,说明是字符型
用order by查询列数
判断回显位,确保让原有查询语句为空
查询当前数据库
查询当前数据库下的表名并一行显示
一行显示函数 group_concat ()
-1' union select 1,group_concat(table_name)from information_schema.tables where table_schema='sqli' #
查询flag表里有哪些字段
2.报错注入
当遇到没有回显位,但是会有报错信息时,可以使用报错注入。
extractvalue()函数
作用:主要用于从 XML 文档中提取特定节点的值。通常与sql注入攻击相关联
注入语句:
extractvalue(1,concat(0x7,(select group_concat(schema_name))))
updatexml()函数
作用:mysql对xml文档数据进行查询和修改的xpath函数
注入语句:
updatexml(1,concat(0x7e,(select database()),0x7e),1)
0x3a :冒号
0x7e ~
boolean 盲注
当页面只能显示1(条件为真)和0 (条件为假)的时候,就可能存在布尔盲注。
ascii(substr(sr1,第几位开始截取,截取几位))>90
截取到的字符转化成ascii是否大于90。
还可以用正则表达式 regexp ^[a-z]
?id=1 and database() regexp'^a'--+
表示当前网站的数据库名第一个字符是否是a
时间盲注
特点:当前页面没有任何显示,看不出页面的变化。
if(left(database(),1)='s',sleep(5),0)
当条件为真时,就会执行延时
sql injection——宽字节注入
大家不理解的话可以参考这篇文章https://blog.csdn.net/2401_89233381/article/details/144636215?ops_request_misc=%257B%2522request%255Fid%2522%253A%25226a8bf1179833fe7059c69a95dc548299%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=6a8bf1179833fe7059c69a95dc548299&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_click~default-2-144636215-null-null.142^v102^pc_search_result_base6&utm_term=%E5%AE%BD%E5%AD%97%E8%8A%82%E6%B3%A8%E5%85%A5&spm=1018.2226.3001.4187当网站用addslashe()函数转义时,该函数会在某些字符前面加‘ / ’转义,而且输入%df时转义函数就会在前面加入反斜杠,此时就变成这样/%df,而在GBK编码中会转成汉字。
宽字节注入的原理就是当网站使用GBK编码时,且对字符编码处理不当导致存在sql注入漏洞。
主要的两个转义函数 addslashe()、mysql_real_escape_string() 函数
base64 注入
就是将输入的字符使用base64编码
搜索型注入
%like%
k%'and1=1--+
pikachu靶场
先输入1',发现是单引号闭合
输入
结果说明没有4列
输入order by 3,成功回显
1%' union select 1,2,3 #
找到数据库
cookic 注入
原理还是一样,只是传参变成cookie(请求头)
抓包改包,看哪个界面会报错
http头部注入(user-agent)(referer)
insert into 输入的方式不能用注释的方式--+要用引号闭合
二次注入
原理是攻击者构造的恶意数据存储在数据库后,恶意数据被读取并进入到SQL查询语句所导致的注入。
注册好后登录,进入后更改密码
然后登录admin用新密码,成功登录
查看代码发现并没有做过滤,所以当admin’# 输入进来后,被’#当成闭合和注释了,就相当于是在给admin改密码