SQL注入原理
SQL注入(SQLInjection)是一种常见的web安全漏洞,攻击者利用这个漏洞,可以访问或修改数据,或利用潜在的数据库漏洞进行攻击。
针对SQL注入的攻击行为可描述为通过用户可控参数中注入SQL语法,破坏原有SQL结构,达到编写程序时意料之外结果的攻击行为。其成因可以归结外一下两个原因叠加造成的:
-
程序编写者在处理程序和数据库交互时,使用字符串拼接的方式构造SQL语句。
-
未对用户可控参数进行足够的过滤便将参数内容拼接进入到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注入
判断字符型、数字型
-
数字型注入
当输入的参数为整型时,则有可能存在数字型注入漏洞。
假设存在一条 URL 为:HTTP://www.aaa.com/test.php?id=1
可以对后台的 SQL 语句猜测为:
SELECT * FROM table WHERE id=1-
判断数字型漏洞的 SQL 注入点
-
先在输入框中输入一个单引号 '
这样的 SQL 语句就会变为:
SELECT * FROM table WHERE id=1’,
不符合语法,所以该语句肯定会出错,导致脚本程序无法从数据库获取数据,从而使原来的页面出现异常。 -
在输入框中输入 and 1 = 1
SQL语句变为:
SELECT * FROM table WHERE id=1 and 1 = 1
语句正确,执行正常,返回的数据与原始请求无任何差异。 -
在数据库中输入 and 1 = 2
SQL 语句变为:
SELECT * FROM table WHERE id=1 and 1 = 2
虽然语法正确,语句执行正常,但是逻辑错误,因为 1 = 2 为永假,所以返回数据与原始请求有差异。
-
-
如果以上三个步骤全部满足,则程序就可能存在数字型 SQL 注入漏洞。
-
-
字符型注入
当输入参数为字符串时,则可能存在字符型注入漏洞。数字型与字符型注入最大的区别在于:数字型不需要单引号闭合,而字符型一般需要使用单引号来闭合。
字符型注入最关键的是如何闭合 SQL 语句以及注释多余的代码。
假设后台的 SQL 语句如下:
SELECT * FROM table WHERE username = 'admin’
-
判断字符型漏洞的 SQL 注入点:
-
还是先输入单引号 admin’ 来测试
这样的 SQL 语句就会变为:
SELECT * FROM table WHERE username = ‘admin’’。
页面异常。 -
输入:admin’ and 1 = 1 –
注意:在 admin 后有一个单引号 ',用于字符串闭合,最后还有一个注释符 --(两条杠后面还有一个空格!!!)。
SQL 语句变为:
SELECT * FROM table WHERE username = ‘admin’ and 1 = 1 –
页面显示正确。 -
输入:admin’ and 1 = 2 –
SQL 语句变为:
SELECT * FROM table WHERE username = ‘admin’ and 1 = 2 –
页面错误。
-
- 满足上面三个步骤则有可能存在字符型 SQL 注入
-
其他类型
其它类型比如Cookie 注入、POST 注入、延时注入等。
POST注入:注入字段在 POST 数据中
Cookie注入:注入字段在 Cookie 数据中
延时注入:使用数据库延时特性注入
搜索注入:注入处为搜索的地方
base64注入:注入字符串需要经过 base64 加密
- 正常下输入参数id=1 正常显示
- 输入参数id=1‘ 报错 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传