蜗蜗侠's Blog-关注网络安全移动版

主页 > 技术笔记 >

SQL注入漏洞详解 第一集

0x01  前言    好久不见,这次讲解sql注入漏洞

0x02  详情
首先我们来学习一下mysql的查询命令,了解网站与数据库的交互是怎么运作的。我这里用phpmyadmin来演示。

[AppleScript] 纯文本查看 复制代码
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
$conn = mysql_connect('localhost', 'root', 'root') or die('bad!');
mysql_query("SET NAMES binary'");
mysql_select_db('test', $conn) OR emMsg("数据库连接失败");
//执行sql语句
$id = isset($_GET['id']) ? $_GET['id'] : 1;   //从前台get获取参数id的值,当id没赋值的时候,默认为1,即id=1
$sql = "SELECT * FROM news WHERE id={$id}"; //执行sql语句,可以看到id={$id}    将前台获取的值直接带入查询
$result = mysql_query($sql, $conn) or die(mysql_error());
?>
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>新闻</title>
</head>
<body>
<?php
$row = mysql_fetch_array($result, MYSQL_ASSOC);
echo "<h3>{$row['title']}</h3><p>{$row['content']}<p>\n";      //输出从数据库获得的titlecontent的数据到html
mysql_free_result($result);
?>
</body>
</html>

这是我们的代码,鉴于有些兄弟不会PHP,我这里上面都添加了注释。
我们再来看看数据库

值得注意的是,mysql是从第0行开始,不是从第1行   第1行是第0行。记住这个概念

我们继续来看,当请求127.0.0.1/test.php?id=1的时候,我们来看看数据库是怎么执行命令的

可以看到执行了

[AppleScript] 纯文本查看 复制代码
?
1
select * from news where id=1

我们到phpmyadmin里去执行一下

看到返回的是一样的,为什么多了一列id?请上去看看代码,我没输出id,肯定没有。

这里拼接sql语句是存在sql注入漏洞的。
我们添加一个单引号试试


我们用and 1=1  和and 1=2 来测试一下



and1=1返回正常,and1=2是个假命题,所以数据库没返回数据。
我们来构造注入语句,这里我们使用union语句

[AppleScript] 纯文本查看 复制代码
?
1
http://192.168.30.20/test.php?id=1%20union%20select%201,2,3%20from%20admin%23


为什么还是看不到?因为我们只输出两行,所以我们看不到,这时候,我们把id换成一个不存在的值

可以看到   输出了第二列与第三列,union语句的后面的列数需要与前面相同,一般我们就用1,2,3,4......这样去测试列数,或者使用order by来测试,大家可以自行去学习。后面库的列数与前面库的列数不一样会报错

这时我们构造语句

[AppleScript] 纯文本查看 复制代码
?
1
http://192.168.30.20/test.php?id=-1%20union%20select%201,2,user()%20from%20admin%23



爆出当前数据用户。这里是存在注入的。

我们用神器sqlmap跑一遍,验证一下。




可以注入出数据。

(责任编辑:蜗蜗侠)