利用SQL注入漏洞拖库
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的
SQL Injection,即 SQL 注入。\r\n
SQL 注入是从正常的 WWW 端口访问,而且表Fra Baidu bibliotek看
起来跟一般的 Web 页面访问没什么区别,所以目前市面的防火墙都不会对 SQL 注入发出警
报,如果管理员没查看 IIS 日志的习惯,可能被入侵很长时间都不会发觉。\r\n
5 Php 脚本
把该文件命名为 index.php,其内容为:、
<?php $servername = "localhost"; $dbusername = "root"; $dbpassword = "123456"; $dbname = "lab"; $id=$_GET['id'];//id 未经过滤 $conn=mysql_connect($servername,$dbusername,$dbpassword) or die ("数据库连接失败 "); mysql_select_db($dbname,$conn); mysql_query('set names utf8'); $sql = "SELECT * FROM article WHERE articleid='$id'"; $result = mysql_query($sql,$conn); $row = mysql_fetch_array($result); echo "<p>利用 SQL 注入漏洞拖库<p>"; if (!$row){ echo "该记录不存在"; exit; } echo "标题<br>".$row['title']."<p>"; echo "内容<br>".$row['content']."<p>"; ?>
注入发出警报,如果管理员没查看 IIS 日志的习惯,可能被入侵很长时间都不会发觉。\r\n
随着 B/S 模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多。但是由于
这个行业的入门门槛不高,程序员的水平及经验也参差不齐,相当大一部分程序员在编写代
码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。用户可以提
虽然提示该记录不存在,但该命令已经执行了。
INSERT INTO `article` VALUES ('1', '利用 SQL 注入漏洞拖库', '看到了吧,一个经构造后的 sql 语句竟有如此可怕的破坏力,相信你看到这后,开始对 sql 注入有了一个理性的认识了吧~\r\n 没错,SQL 注入就是这么容易。但是,要根据实际情况构造灵活的 sql 语句却不是那么容易 的。有了基础之后,自己再去慢慢摸索吧。\r\n 有没有想过,如果经由后台登录窗口提交的 数据都被管理员过滤掉特殊字符之后呢?这样的话,我们的万能用户名’ or 1=1#就无法使 用了。但这并不是说我们就毫无对策,要知道用户和数据库打交道的途径不止这一条。\r\n 更多关于 SQL 注入的信息请看我的另一篇博文:利用 SQL 注入拖库');
4 Mysql 脚本
use lab; DROP TABLE IF EXISTS `article`; CREATE TABLE `article` (
`articleid` int(11) NOT NULL AUTO_INCREMENT, `title` varchar(100) CHARACTER SET utf8 NOT NULL DEFAULT '', `content` text CHARACTER SET utf8 NOT NULL, PRIMARY KEY (`articleid`) );
假设 php 脚本的文件名为 index.php,放在/var/www/html/drag 目录下。则浏览方式如 下:
http://192.168.1.11:81/drag/index.php?id=1
6 拖库
6.1 首先使用 mysql 命令测试一下。
use lab; SELECT * FROM article into outfile 'mydrag.txt'; 看到提示:Query OK, 3 rows affected (0.00 sec)说明命令可以使用,且没有写入权限问题 (注:linux 的文件操作权限比较严格,在 windows 系统下则比较容易实现) 到/var/lib/mysql/lab/目录下查看,可以发现有 mydrag.txt 文件存在(注:如果在 windows 系统下,可以将 outfile 的目录设置为 web 目录下,然后在浏览器输入文件路径直接下载回 来)。
6.2 网页拖库
在地址栏输入: http://192.168.1.11:81/drag/index.php?id=1’into outfile ‘outfile.txt’%23 分析:%23 是#的 ASCII 码,由于在地址栏中直接输入#后到数据库系统中会变成空,需 要在地址栏中输入%23,那么才会变成#,进而注释掉后面的 sql 语句。 运行之后,打开/var/lib/mysql/lab/,发现多了一个 sql.txt 文件,打开之后,里面就是表 article 中的一条记录。 为什么只有一条记录呢?难道该数据表就只有一条记录?不是这样的,因为我们只检索 id 为 1 的一条记录而已,那么能否将 article 表中的所有记录一次性全部下载下来呢? 答案是可以的,只要你的构造的 SQL 语句足够灵活(再次提出了构造 SQL 语句的灵活性)。 分析一下,当在 URL 地址栏中输入'into outfile 'outfile.txt '%23 的时候,合并到 sql 查询 语句中变为: SELECT * FROM article WHERE articleid='5' into outfile ' outfile.txt'#' 仔细分析下之后,我们可以这样子构造 SQL 语句: SELECT * FROM article WHERE articleid='' or 1=1 into outfile ' outfile.txt'#' 这样的话,无论如何 WHERE 子句总是为真,换句话说,该 sql 语句等价于如下: SELECT * FROM article into outfile 'outfile.txt'#' 懂了吧,该 sql 语句在先执行 select 语句,将表 article 中的所以内容全部检索出来,然 后再执行 into outfile 'outfile.txt'#'将内容导出来。 利用 SQL 注入漏洞,我们可以猜测表名,列名,用户的密码长度(LEFT 函数)等等,当然 了,如果能直接向以上的演示那样将表中的数据全部导出的话就没必要去猜表名列名等等。
INSERT INTO `article` VALUES ('2', 'SQL 注入漏洞防不胜防', 'select * from users where username=\'\' or 1=1#\' and password=md5(\'\')\r\n 语义分析:“#”在 mysql 中是注释符,这 样井号后面的内容将被 mysql 视为注释内容,这样就不会去执行了,换句话说,以下的两句 sql 语句等价:\r\nselect * from users where username=\'\' or 1=1#\' and password=md5(\'\')\r\n 等价于\r\nselect * from users where username=\'\' or 1=1\r\n \r\n 因为 1=1 永远是都是成立的, 即 where 子句总是为真,将该 sql 进一步简化之后,等价于如下 select 语句:\r\nselect * from users\r\n 没错,该 sql 语句的作用是检索 users 表中的所有字段\r\n 小技巧:如果不知道’ or
但
是,SQL 注入的手法相当灵活,在注入的时候会碰到很多意外的情况。能不能根据具体情况
进行分析,构造巧妙的 SQL 语句,从而成功获取想要的数据,是高手与“菜鸟”的根本区
别。');
假设 mysql 的脚本文件为 darg.sql,那么,导入数据库的方法为:先进入 mysql,use lab, source /路径/darg.sql
利用 SQL 注入漏洞拖库的方法
1 建立数据库和表
建立数据库 lab。 在 lab 数据库创建一张表 article
2 建立测试网页
在/var/www/html 目录下新建目录 drag
3 注意编码格式
用 vim 打开后:set fileencoding 即可显示文件编码格式 将编码统一设置为 utf8
1=1#中的单引号的作用,可以自己 echo 下 sql 语句,就一目了然了。');
INSERT INTO `article` VALUES ('3', 'SQL 的定义', ' SQL 注入是从正常的 WWW 端口访问,而
且表面看起来跟一般的 Web 页面访问没什么区别, 所以目前市面的防火墙都不会对SQL