SQL 注入攻击是通过将恶意的 SQL 查询或添加语句插入到应用的输入参数中,再在后台 SQL 服务器上解析执行进行的攻击,它目前黑客对数据库进行攻击的最常用手段之一。
注入攻击的本质,是把用户输入的数据当做代码执行
这里有两个关键条件
正常访问网站操作流程是用户提交参数给网站,并将数据库查询结果返回给用户,提交正常的参数一般不会有危险。但实际情况是黑客可以提交恶意构造的参数,并拼接成恶意查询语句,如果用户输入的数据被构造成恶意代码,Web 应用又未对动态构造的 SQL 语句使用的参数进行审查,将会执行该恶意数据查询语句,则会带来意想不到的危险。
SQL 注入漏洞产生的危害
通常情况下,可能存在 SQL 注入漏洞的地方一定是动态网页且此网页访问了数据库,同时不管是GET或者POST请求方式,其一定是可以带参数(一个或者多个)传入参数值,
如GET请求方式时,如下,其中id为参数,1为传入参数的值
# GET方式访问网址地址:
http://localhost/arts.php?id=1
判断存在SQL 注入最直观的表现主要有以下方式:
最为经典的单引号判断法: 在参数后面加上单引号,比如:
http://xxx/abc.php?id=1'
如果页面返回错误,则存在 SQL 注入。原因是无论字符型还是整型都会因为单引号个数不匹配而报错。
and 1=1
时,后台执行 SQL 语句,页面返回正常:select * from <表名> where id = x and 1=1
and 1=2
时,后台执行 SQL 语句,页面返回不正常:select * from <表名> where id = x and 1=2
综上可以初步判断存在注入漏洞,因为可以确定数据库对我们传入的语句能够执行,且页面有差异。
通常注入主要分为数字型和字符型,但在不断实践中根据不同地方产生参数点、不同的编码、不同的执行代码返回的方式,常遇到如下注入类型,总结如下:
注入类型 | 条件 | 关键 |
---|---|---|
union注入 | 显示查询结果 | order by , union select |
布尔注入 | 只返回False或者True | length、ord函数、二分法 |
报错注入 | 返回错误信息 | updatexml、group_concat等函数 |
时间盲注 | 无返回信息判断可执行sleep | sleep、if等函数 |
宽字节注入 | 数据库为GBK编码、使用了addslashes函数转义 | %df'可以吃掉单引号 |
堆叠注入 | 执行多条查询语句 | 使用分号分隔多条查询语句 |
Cookie注入 | 在请求头中cookie参数异常 | 可用 sqlmap -r cook.txt - p 参数 |
base64注入 | 有base64编码过的参数 | 将payload进行base64编码,可用tamper |
XFF注入 | PHP中有getenv函数获取环境配置 | x-forward-for、http_client_ip等请求头参数 |
二次注入 | 用户注册功能等 | 在注册中插入恶意代码,在登录中执行 |