SQL注入的三种类型:
数字型
分析注入产生的原因:
访问测试地址:
http://192.168.3.35/sql/shuzi/index.php?id=1
输出页面
查看源码文件
sql注入测试
error:'.mysql_error().'');
}
echo "sql注入测试";
echo "";
echo "id ";
echo "标题 ";
echo "内容 ";
echo " ";
`
//遍历查询结果
`
while ($row = mysql_fetch_array($result))
{
if (!$row){
echo "该记录不存在";
exit;
}
echo "";
echo "".$row[0]." ";
echo "".$row[1]." ";
echo "".$row[2]." ";
echo " ";
}
echo "sql语句: >".$sql." ";
echo "
";
?>
点我进入后台
md5解密可以点我
$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.判断方法:
正常访问
1.单引号直接报错
主要是因为单引号在大部分数据库中作为分隔符,所以当单引号带入数据库内就会导致数据库内sql语句被截断导致数据库错误返回。
2.and 1=1 和 and 1=2 返回数据不同的判断
(原理:1=1 为true的条件,1=2 为false的条件,and 连接前面查询为真的条件形成 true and true 和 true and false 两种判断。)
Or 也是使用上面的方法进行判断,但当在数字后输入or 1=1为永真条件,所以返回应该是所有的数据,or 1=2 返回的为真条件查询的结果。
3.加减法判断,加减法的判断主要是用于判断sql注入为数字型和字符型。也可以根据参数后的数字和字符进行判断。
但因为+号在sql语句中有特俗含义所以需要使用url编码%2b 减号则不用。
字符型
字符型
源码:
sql
";
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']."
";
echo "用户名:".$row['username']."
";
echo "用户密码:".$row['password']."
";
echo "用户邮箱:".$row['email']."
";
}
mysql_close($conn); //关闭数据库连接
echo "
";
echo "你当前执行的sql语句为:"."
";
echo $sql;
?>
数据库:
-- 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', '[email protected]'),
(2, 'admin1', 'e10adc3949ba59abbe56e057f20f883e', '[email protected]'),
(3, 'asaass', 'e10adc3949ba59abbe56e057f20f883e', '[email protected]'),
(4, 'asaass', 'asaass123', '[email protected]');
/*!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 返回正常页面相等 注:返回数据多少判断是否存在
搜索型
源码:
搜索型注入
";
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']."
";
echo "用户名:".$row['username']."
";
echo "用户密码:".$row['password']."
";
echo "用户邮箱:".$row['email']."
";
}
mysql_close($conn); //关闭数据库连接
echo "
";
echo "你当前执行的sql语句为:"."
";
echo $sql;
?>
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 '%'='