SQL注入

SQL注入原理

SQL注入(SQLInjection)是一种常见的web安全漏洞,攻击者利用这个漏洞,可以访问或修改数据,或利用潜在的数据库漏洞进行攻击。

针对SQL注入的攻击行为可描述为通过用户可控参数中注入SQL语法,破坏原有SQL结构,达到编写程序时意料之外结果的攻击行为。其成因可以归结外一下两个原因叠加造成的:

  1. 程序编写者在处理程序和数据库交互时,使用字符串拼接的方式构造SQL语句。

  2. 未对用户可控参数进行足够的过滤便将参数内容拼接进入到SQL语句中。

分类

在这里插入图片描述

MYSQL常用函数与参数

version()				# mysql 数据库版本
database()				# 当前数据库名
user()					# 用户名
current_user()			# 当前用户名
system_user()			# 系统用户名
@@datadir				# 数据库路径
@@version_compile_os	# 操作系统版本

length()	        	# 返回字符串的长度
substring()						
substr()	        	# 截取字符串
mid()
left()			        # 从左侧开始取指定字符个数的字符串
concat()	     	   	# 没有分隔符的连接字符串
concat_ws()      		# 含有分割符的连接字符串
group_conat()   		# 连接一个组的字符串
ord()					# 返回ASCII 码
ascii()	
hex()					# 将字符串转换为十六进制
unhex()					# hex 的反向操作
md5()					# 返回MD5 值
floor(x)				# 返回不大于x 的最大整数
round()					# 返回参数x 接近的整数
rand()					# 返回0-1 之间的随机浮点数
load_file()				# 读取文件,并返回文件内容作为一个字符串
sleep()			        # 睡眠时间为指定的秒数
if(true,t,f)			# if 判断
find_in_set()			# 返回字符串在字符串列表中的位置
benchmark()				# 指定语句执行的次数

简要SQL注入

判断字符型、数字型

  1. 数字型注入

    当输入的参数为整型时,则有可能存在数字型注入漏洞。
    假设存在一条 URL 为:HTTP://www.aaa.com/test.php?id=1
    可以对后台的 SQL 语句猜测为:
    SELECT * FROM table WHERE id=1

    • 判断数字型漏洞的 SQL 注入点

      1. 先在输入框中输入一个单引号 '
        这样的 SQL 语句就会变为:
        SELECT * FROM table WHERE id=1’
        不符合语法,所以该语句肯定会出错,导致脚本程序无法从数据库获取数据,从而使原来的页面出现异常。

      2. 在输入框中输入 and 1 = 1
        SQL语句变为:
        SELECT * FROM table WHERE id=1 and 1 = 1
        语句正确,执行正常,返回的数据与原始请求无任何差异。

      3. 在数据库中输入 and 1 = 2
        SQL 语句变为:
        SELECT * FROM table WHERE id=1 and 1 = 2
        虽然语法正确,语句执行正常,但是逻辑错误,因为 1 = 2 为永假,所以返回数据与原始请求有差异。

    • 如果以上三个步骤全部满足,则程序就可能存在数字型 SQL 注入漏洞。

  2. 字符型注入

    当输入参数为字符串时,则可能存在字符型注入漏洞。数字型与字符型注入最大的区别在于:数字型不需要单引号闭合,而字符型一般需要使用单引号来闭合。

    字符型注入最关键的是如何闭合 SQL 语句以及注释多余的代码。

    假设后台的 SQL 语句如下:
    SELECT * FROM table WHERE username = 'admin’

  • 判断字符型漏洞的 SQL 注入点:

    1. 还是先输入单引号 admin’ 来测试
      这样的 SQL 语句就会变为:
      SELECT * FROM table WHERE username = ‘admin’’
      页面异常。

    2. 输入:admin’ and 1 = 1 –
      注意:在 admin 后有一个单引号 ',用于字符串闭合,最后还有一个注释符 --(两条杠后面还有一个空格!!!)。
      SQL 语句变为:
      SELECT * FROM table WHERE username = ‘admin’ and 1 = 1 –
      页面显示正确。

    3. 输入:admin’ and 1 = 2 –
      SQL 语句变为:
      SELECT * FROM table WHERE username = ‘admin’ and 1 = 2 –
      页面错误。

  • 满足上面三个步骤则有可能存在字符型 SQL 注入
  1. 其他类型

    其它类型比如Cookie 注入、POST 注入、延时注入等。

    POST注入:注入字段在 POST 数据中
    Cookie注入:注入字段在 Cookie 数据中
    延时注入:使用数据库延时特性注入
    搜索注入:注入处为搜索的地方
    base64注入:注入字符串需要经过 base64 加密

  • 正常下输入参数id=1 正常显示

在这里插入图片描述- 输入参数id=1‘ 报错 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值