SQL注入的三种类型:
数字型
分析注入产生的原因:
访问测试地址:
http://192.168.3.35/sql/shuzi/index.php?id=1
输出页面
image.png查看源码文件
<html>
<head>
<meta charset="utf-8" />
<title>sql注入测试</title>
<style>
body{text-align:center}
</style>
</head>
<body >
<br />
<?php
include "./conn.php";
$id=@$_GET['id'];//id未经过滤
if($id==null){
$id="1";
}
mysql_query('set names utf8');
$sql = "SELECT * FROM sqltest WHERE id=$id";//定义sql语句并组合变量id
$result = mysql_query($sql,$conn);//执行sql语句并返回给变量result
if(!$result)
{
die('<p>error:'.mysql_error().'</p>');
}
echo "<font size='10' face='Times'>sql注入测试</font></br>";
echo "<table border='2' align=\"center\">";
echo "<tr><td>id</td>";
echo "<td>标题</td>";
echo "<td>内容</td>";
echo "</tr>";
`
//遍历查询结果
`
while ($row = mysql_fetch_array($result))
{
if (!$row){
echo "该记录不存在";
exit;
}
echo "<tr>";
echo "<td>".$row[0]."</td>";
echo "<td>".$row[1]."</td>";
echo "<td>".$row[2]."</td>";
echo "</tr>";
}
echo "<td colspan=\"3\" >sql语句: >".$sql."</td>";
echo "</table>";
?>
<a href='./admin.php'>点我进入后台</a>
<a href='http://pmd5.com/'>md5解密可以点我</a>
</body>
</html>
$id=@$_GET['id'];//id未经过滤 接受参数id的值,ID的值没有做任何限制的情况下输出到下面sql语句中并带入数据库进行执行
if($id==null){
$id="1";
}
mysql_query('set names utf8');
$sql = "SELECT * FROM sqltest WHERE id=$id";//定义sql语句并组合变量id
$result = mysql_query($sql,$conn);//执行sql语句并返回给变量result
操作相当于直接在数据库执行SQL语句,并输出到页面。
SELECT * FROM sqltest WHERE id=1
利用方法:
1.判断方法:
正常访问
image.png1.单引号直接报错
主要是因为单引号在大部分数据库中作为分隔符,所以当单引号带入数据库内就会导致数据库内sql语句被截断导致数据库错误返回。
image.png2.and 1=1 和 and 1=2 返回数据不同的判断
(原理:1=1 为true的条件,1=2 为false的条件,and 连接前面查询为真的条件形成 true and true 和 true and false 两种判断。)
image.png image.pngOr 也是使用上面的方法进行判断,但当在数字后输入or 1=1为永真条件,所以返回应该是所有的数据,or 1=2 返回的为真条件查询的结果。
image.png image.png3.加减法判断,加减法的判断主要是用于判断sql注入为数字型和字符型。也可以根据参数后的数字和字符进行判断。
但因为+号在sql语句中有特俗含义所以需要使用url编码%2b 减号则不用。
image.png image.png字符型
字符型
源码:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>sql</title>
</head>
<body bgcolor="">
<font size="3" color="#000000">
<?php
$name=$_GET['username'];
$conn=mysql_connect("127.0.0.1","root","root");
if($conn){
echo "连接数据库成功!";
}
echo "<br>";
mysql_select_db('test',$conn);
$sql="select * from user where username = '$name'";
$result=mysql_query($sql);
while($row = mysql_fetch_array($result))
{
echo "用户ID:".$row['id']."<br >";
echo "用户名:".$row['username']."<br >";
echo "用户密码:".$row['password']."<br >";
echo "用户邮箱:".$row['email']."<br >";
}
mysql_close($conn); //关闭数据库连接
echo "<hr>";
echo "你当前执行的sql语句为:"."<br >";
echo $sql;
?>
</body>
</html>
数据库:
-- phpMyAdmin SQL Dump
-- version phpStudy 2014
-- http://www.phpmyadmin.net
--
-- 主机: localhost
-- 生成日期: 2017 年 11 月 01 日 07:19
-- 服务器版本: 5.5.53
-- PHP 版本: 5.4.45
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
--
-- 数据库: `test`
--
-- --------------------------------------------------------
--
-- 表的结构 `user`
--
CREATE TABLE IF NOT EXISTS `user` (
`id` int(3) NOT NULL AUTO_INCREMENT,
`username` varchar(10) COLLATE utf8_unicode_ci NOT NULL,
`password` varchar(32) COLLATE utf8_unicode_ci NOT NULL,
`email` varchar(32) COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=5 ;
--
-- 转存表中的数据 `user`
--
INSERT INTO `user` (`id`, `username`, `password`, `email`) VALUES
(1, 'admin', '3f230640b78d7e71ac5514e57935eb69', 'asaass@qq.com'),
(2, 'admin1', 'e10adc3949ba59abbe56e057f20f883e', '123@123.qq.com'),
(3, 'asaass', 'e10adc3949ba59abbe56e057f20f883e', 'asd123@qq.com'),
(4, 'asaass', 'asaass123', 'asaass@qq.com');
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
原理:
$query="select user from users where username='$_GET['name']'";
数据库执行的语句为
select user from users where username='name'
当开发人员对用户的输入过滤不严,造成了用户可以通过输入SQL语句控制数据库,就会产生SQL注入漏洞。
基于字符型的SQL注入即存在SQL注入漏洞的URL参数为字符串类型(需要使用单引号表示)
字符注入区别于数字注入的主要区别在于sql语句的闭合
注入的实现在于跳出字符串的限制,实现sql语句在执行
字符型和数字型的区别:
字符:除数字之外都是字符
数字:0-9
两种SQL语句的区别:
数字型: SELECT 列 FROM 表 WHERE 数字型列=值
字符型: SELECT 列 FROM 表 WHERE 字符型列=’值’
注入点的判断:
返回正确和错误进行判断,1=1返回正常页面,1=2 错误返回错误页面。表示存在
username=xxx' and 1=1 --'
username=xxx' and 1=2 --'
或者
uername=xxx' and '1'='1
uername=xxx' and '1'='2
或者
username=admin' or '1'='1 返回其他查询信息
username=admin' or '1'='2 返回正常页面相等 注:返回数据多少判断是否存在
image.png
image.png
搜索型
源码:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>搜索型注入</title>
</head>
<body bgcolor="">
<font size="3" color="#000000">
<?php
$pwd=$_GET['pwd'];
$conn=mysql_connect("127.0.0.1","root","root");
if($conn){
echo "连接数据库成功!";
}
echo "<br>";
mysql_select_db('test',$conn);
$sql="select * from user where password like '%$pwd%' order by password";
$result=mysql_query($sql);
while($row = mysql_fetch_array($result))
{
echo "用户ID:".$row['id']."<br >";
echo "用户名:".$row['username']."<br >";
echo "用户密码:".$row['password']."<br >";
echo "用户邮箱:".$row['email']."<br >";
}
mysql_close($conn); //关闭数据库连接
echo "<hr>";
echo "你当前执行的sql语句为:"."<br >";
echo $sql;
?>
</body>
</html>
1.原理:
首先我们看SQL语句:
select * from user where password like '%asaass123%' order by password
执行的sql语句带入字符因为通过%%通配符匹配模糊查询,想要执行SQL语句需要跳出搜索字符的限制。然后构造后执行SQL语句。
2.判断搜索型注入的方法:
1 搜索keywords‘,如果出错的话,有90%的可能性存在漏洞;
2 搜索 keywords%,如果同样出错的话,就有95%的可能性存在漏洞;
3 搜索keywords% 'and 1=1 and '%'='(这个语句的功能就相当于普通SQL注入的 and 1=1)看返回的情况
4 搜索keywords% 'and 1=2 and '%'='(这个语句的功能就相当于普通SQL注入的 and 1=2)看返回的情况
5 根据两次的返回情况来判断是不是搜索型文本框注入了
%'and 1=1 and '%'='
%' and 1=1--'
%' and 1=1 and '%'='
image.png
网友评论