SQL注入

SQL注入原理

在调用数据库的动态页面中,应用程序在接收前端传递的参数时,没有对参数进行过滤或者过滤不严格,导致传入的参数被拼接到SQL语句中执行。

Python代码演示漏洞形成过程

import pymysql
 
# 打开数据库连接
db = pymysql.connect(host="127.0.0.1", port=3306, user="root", password="123456", database="user_test")
# 使用 cursor() 方法创建一个游标对象
cursor = db.cursor()
# 接收前端传入的参数。
id = request.values.get("id")
# 构建sql语句。
sql = "select name from student wehere id = %s" %(id)
# 执行SQL语句
cursor.execute(sql)
# 获取所有数据
data = cursor.fetchall()
print(data)
#关闭链接
db.close()

1.产生原因:
代码中在接受用户传入的参数后没有对参数进行过滤处理,直接把用户传入的参数带入带SQL语句中执行。导致SQL注入漏洞产生。
2.验证:
如果用户传参输入的参数是: -1 union select user()那么构造的SQL语句是select name from student wehere id = -1 union select user();
实验使用的是MySQL数据库,user()函数 查询数据库当前用户。
MySQL执行结果
可以看到查出来了数据库的user信息,说明可以通过该参数点来控制SQL语句。

SQL注入危害

  1. 盗取用户数据和隐私。
  2. 攻击者可对目标数据库进行“增删改查”,一旦攻击者删库,企业整个业务将陷于瘫痪,极难恢复。
  3. 植入网页木马程序,对网页进行篡改。
  4. 添加管理员帐号。

SQL注入漏洞修复

SQL注入漏洞造成原因是服务端相信用户输入导致的,修复手法主要以检查过滤用户的输入。
1.在执行SQL之前对传入的参数进行过滤,过滤SQL敏感函数字段以及特殊字符。
2.如果参数是数字类型的,在执行SQL之前提前对参数进行数字类型转换。
3.采用预编译。

SQL语句执行流:判断SQL语法是否正确-进行语句优化-语句解析-生成可执行函数-执行。
预编译就是将经常使用的SQL提前进行语句优化解析生成可执行函数。当需要使用直接调用该函数传入参数执行即可,这样传入的参数仅仅只是参数不会当作SQL执行,从而有效的防止SQL注入。

SQL注入方法

适用于回显SQL注入的方法:

1.使用 union / union all 联合查询注入的方法:
union 用于合并两个或多个 SELECT 语句的结果集,并消去表中任何重复行。如果保留重复行使用 union all

select name from student wehere id =  -1 union select user();

2.二次注入:
指已存储(数据库、文件)的用户输入被读取后再次进入到sQL查询语句中导致的注入。
3.堆叠注入:
可以使用多条SQL语句的注入。
MySQL以;表示一个语句的结束,那么可以在;之后在写入一段SQL也是可以执行的,当然这种方式需要数据库引擎支持这种操作方式才行。

select name from student where id=-1 union select user();show databases;show tables;

4.宽字节注入:
宽字节注入的产生是字符集不一致造成的,如:前端使用UTF-8编码,数据库使用GBK编码,在进行解码时,数据库将两位的UTF-8编码读取成一位GBK编码,从而绕过服务器的转义函数,进行的sql注入。

适用于无回显注入方法

SQL盲注入发生在web应用程序存在SQL注入时,但其HTTP响应不包含SQL查询的结果或数据库错误的任何细节。这与常规的SQL注入不同,在常规SQL注入中,数据库错误信息和SQL查询的输出显示在web应用程序中,我们可以看到。在盲SQL注入中,我们看不到SQL查询的输出。尽管如此,我们可以通过使用数据库的特殊函数,让页面延迟加载或和页面返货TRUE/FLOUS来帮助我们猜解数据库信息。
1.时间盲注
适用于页面不会返回错误信息,只会回显一种界面,主要特征是利用sleep函数,制造时间延迟,由回显时间来判断是否报错。

and sleep(if(substr(database(),1,1)="s",5,0))

如果延迟5秒,则表示数据库第一个字符为s。
2.布尔盲注
布尔型盲注应用于无数据回显,且WEB页面无报错信息的情况,此时不能通过报错型注入的方法来爆出数据,布尔型盲注的WEB页面只有两种回显结果,正确的页面以及错误的页面,且错误的页面无报错提示语句,正确的页面不能输出数据。

and (length(database()) = 8)

如果页面正确返回,则表示数据库长度为8。
3.报错盲注
报错注入就是利用了数据库的某些机制,人为地制造错误条件,使得查询结果能够出现在错误信息中。

id='and(select extractvalue(1,concat(0x7e,(select database()))))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值