实验链接
SQL注入攻击是黑客对数据库进行攻击的常用手段之一。随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多。但是由于程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQL Injection,即SQL注入。
链接:http://www.hetianlab.com/expc.do?ce=193d68b2-908c-4eb3-958a-9582ae19a1f9
实验简介
实验所属系列:Web应用安全
实验对象: 本科/专科信息安全专业
相关课程及专业:信息网络安全概论
实验类别:实践实验类
实验目的
-
深入理解sql注入工作原理;
-
怎么去绕过正则表达式实现注入
-
培养学生的独立思考能力
预备知识
给出如下参考链接(你亦可自己到网上去找相关内容学习): http://www.2cto.com/Article/201208/151503.html
实验环境
浏览器/服务器环境;
服务器配置:apache+php+Mysql;
打开实验网址(http://10.1.1.11:81),可以看到实验练习系统。
实验步骤
步骤一
实例一:热身运动,不设防
关键代码:
本例任务:尝试进行sql注入,目标为得到数据库中的用户名与密码,并对你的sql注入测试语句及简单说明。
打开实例1:
根据上述关键代码可知由 ’ 进行识别,构造name:
查看结果,正确
若输入错误,则返回无:
用 union 语句判读列的个数
判断列数为一:
返回错误:
判断列数为两、三……,一直到返回正确为止:
五列时返回正确,说明该数据库内有五列数据。
下面对各列数据类型进行判断
第一列为id,数据类型为字符串;
第二列为name,数据类型为字符串;
第三列为age,数据类型为字符串;
第四、五列未知,但数据类型为字符串。
也可以使用 order by 判断列数:
列数大于等于1正确。
列数大于等于6错误。
列举数据库内所有用户名:
同样的方法列举数据库所有信息:
步骤二
实例二:节约是种美德,少用空格
关键代码:
本例任务:尝试进行sql注入,目标为得到数据库中的用户名与密码,并对你的sql注入测试语句及简单说明。
和实例一尝试相同操作:
返回错误。
由关键代码可知,对空格进行了筛选,因此我们输入的时候采用 %a0 替代空格,用 %23 (#)代替 --+ 进行注释:
接下来与实验一的步骤一致,在此不做演示。
最终结果相同:
步骤三
实例三:继承美德,不用空格
关键代码:
本例任务:尝试进行sql注入,目标为得到数据库中的用户名与密码,并对你的sql注入测试语句及简单说明。
%s是对空格、制表符、换行符的检测,我们可用%a0绕过:
也可使用/**/绕过(起空格效果):
成功!
答题
对于第二题,个人觉得B选项也没有问题。
总结 sql语句
- 注释: # , --+ ,%23
- 空格: “ ”,%a0 ,/**/
- 查询列数:
- order by n:大于等于n列
- union select null,null, ……, null:等于n列( n 个 null )
- 列举全部内容:
- union select TABLE_SCHEMA , TABLE_SCHEMA , ……, TABLE_SCHEMA from information_schema.TABLES
- n为列数
- n 个 TABLE_SCHEMA
- 不需要的内容可以将 TABLE_SCHEMA 换成 null