参考文章:新手指南:DVWA之SQL Injection

原理

SQL Injection,即SQL注入,是指攻击者通过注入恶意的SQL命令,破坏SQL查询语句的结构,从而达到执行恶意SQL语句的目的

SQL注入漏洞的危害是巨大的,常常会导致整个数据库被“脱裤”,尽管如此,SQL注入仍是现在最常见的Web漏洞之一

基本注入过程

1.判断是什么数据库
2.判断是否存在注入,注入是字符型还是数字型
3.猜解SQL查询语句中的字段数
4.确定显示的字段顺序
5.获取当前数据库
6.获取数据库中的表
7.获取表中的字段名
8.获取数据

分析

Low

先看一下代码,进行审计,找出可注入原因
可以看到这里,对输入的id值,没有进行过滤,导致可以进行注入
image.png

数据库和注入类型

通过报错语句,得知数据库类型为MySQL,注入类型为单引号字符串
image.png

显示字段

通过测试判断为2个显示字段
image.png

数据库

1’ union select database(),2#
image.png

表名

1’ union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() —+
image.png

字段名

这里获取users表的列名,其他表的列名都一样

1’ union select 1,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name=’users’#
image.png

数据

这里获取useres表的user,password字段的数据,其他都一样

1’ union select user,password from users#

image.png

注意事项

group_concat的时候不带s,information_schema的时候带s
table_schema—>数据库名 table_name—>表名
注释很重要,一定要加
表名和列名都是变值,都有多个

Medium

老样子,看代码,进行审计,找出可注入原因
看到对输入的数据进行了转义,但是输入的值确是数字型,转义也就是形同虚设了
image.png

数据库和注入类型

这里是需要抓包才能修改数据的,用burp
burp抓不到本地包,要配置IP地址为自己的真实IP

数据库类型:
MySQL 注入类型:数字型
image.png
image.png**

显示字段

经测试,为2个显示字段
image.png
image.png

数据库

image.png

表名

image.png

字段名

这里获取users表的列名,其他表的列名都一样

这里在获取列名的时候,’’被转义了,可以用进制或者编码绕过都可以

还想看别的绕过方法,请看我的另一篇文章:多个层面 Bypass WAF | Hex编码/解码
image.png

数据

这里获取useres表的user,password字段的数据,其他都一样
image.png
**

High

老样子,看代码,进行审计,找出可注入原因
这里也就多了个LIMIT语句,直接注释掉就好了
image.png

数据库和注入类型

数据库肯定是MySQL 注入类型经判断是单引号字符串型
image.png

显示字段

从判断注入类型的时候,就可以看到是显示2个字段了

数据库

image.png

表名

image.png

字段名

这里获取users表的列名,其他表的列名都一样
image.png

数据

这里获取useres表的user,password字段的数据,其他都一样
image.png

注意事项

这里提交查询页面和显示查询结果页面不是同一个,这样做的目的是为了防止一般的sqlmap注入
因为sqlmap在注入过程中,无法在提交查询页面上获取查询的结果,没有了反馈,也就没办法进一步注入

Impossible

老样子,看代码,进行审计,找出不可注入原因
可以看到使用了PDO语句,将代码和数据分开传送,两者是独立的
image.png

PDO语句简介

image.png

如上图,就防止了SQL注入的攻击,原理如下:

当调用 prepare() 时,查询语句已经发送给了数据库服务器,此时只有占位符 ? 发送过去,没有用户提交的数据

当调用到 execute()时,用户提交过来的值才会传送给数据库,他们是分开传送的,两者独立的,所以防止了SQL攻击