原理
SQL Injection,即SQL注入,是指攻击者通过注入恶意的SQL命令,破坏SQL查询语句的结构,从而达到执行恶意SQL语句的目的
SQL注入漏洞的危害是巨大的,常常会导致整个数据库被“脱裤”,尽管如此,SQL注入仍是现在最常见的Web漏洞之一
基本注入过程
1.判断是什么数据库
2.判断是否存在注入,注入是字符型还是数字型
3.猜解SQL查询语句中的字段数
4.确定显示的字段顺序
5.获取当前数据库
6.获取数据库中的表
7.获取表中的字段名
8.获取数据
分析
Low
先看一下代码,进行审计,找出可注入原因
可以看到这里,对输入的id值,没有进行过滤,导致可以进行注入
数据库和注入类型
通过报错语句,得知数据库类型为MySQL,注入类型为单引号字符串
显示字段
通过测试判断为2个显示字段
数据库
1’ union select database(),2#
表名
1’ union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() —+
字段名
这里获取users表的列名,其他表的列名都一样
1’ union select 1,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name=’users’#
数据
这里获取useres表的user,password字段的数据,其他都一样
1’ union select user,password from users#
注意事项
group_concat的时候不带s,information_schema的时候带s
table_schema—>数据库名 table_name—>表名
注释很重要,一定要加
表名和列名都是变值,都有多个
Medium
老样子,看代码,进行审计,找出可注入原因
看到对输入的数据进行了转义,但是输入的值确是数字型,转义也就是形同虚设了
数据库和注入类型
这里是需要抓包才能修改数据的,用burp
burp抓不到本地包,要配置IP地址为自己的真实IP
数据库类型:MySQL 注入类型:数字型
**
显示字段
经测试,为2个显示字段
数据库
表名
字段名
这里获取users表的列名,其他表的列名都一样
这里在获取列名的时候,’’被转义了,可以用进制或者编码绕过都可以
还想看别的绕过方法,请看我的另一篇文章:多个层面 Bypass WAF | Hex编码/解码
数据
这里获取useres表的user,password字段的数据,其他都一样
**
High
老样子,看代码,进行审计,找出可注入原因
这里也就多了个LIMIT语句,直接注释掉就好了
数据库和注入类型
数据库肯定是MySQL 注入类型经判断是单引号字符串型
显示字段
从判断注入类型的时候,就可以看到是显示2个字段了
数据库
表名
字段名
这里获取users表的列名,其他表的列名都一样
数据
这里获取useres表的user,password字段的数据,其他都一样
注意事项
这里提交查询页面和显示查询结果页面不是同一个,这样做的目的是为了防止一般的sqlmap注入
因为sqlmap在注入过程中,无法在提交查询页面上获取查询的结果,没有了反馈,也就没办法进一步注入
Impossible
老样子,看代码,进行审计,找出不可注入原因
可以看到使用了PDO语句,将代码和数据分开传送,两者是独立的
PDO语句简介
如上图,就防止了SQL注入的攻击,原理如下:
当调用 prepare() 时,查询语句已经发送给了数据库服务器,此时只有占位符 ? 发送过去,没有用户提交的数据
当调用到 execute()时,用户提交过来的值才会传送给数据库,他们是分开传送的,两者独立的,所以防止了SQL攻击