常见的sql注入环境搭建
By : Mirror王宇阳
Time:2020-01-06
PHP+MySQL摘要
$conn = new mysqli('数据库服务器','username','password','database');
$conn = mysqli_connect('数据库服务器','username','password','database');
// 参数内容可以单独设置为一个变量引用
$sql = "*****";//sql命令
mysqli_query($conn,$sql);
// 函数返回true/false
$sql = "***1;";
$sql .= "***2;";
$sql .= "****;";//多条sql之间用分号间隔
mysqli_multi_query($conn,$sql);//执行多条sql
mysqli_select_db(connect,db_name);//查询db_name库
or die();//错误信息控制输出函数 die()会输出信息并退出当前脚本
mysqli_error();//返回报错信息
常规回显注入
回显注入类型是指我们的查询内容会被应用回显到页面中;一般情况下回显注入回利用UNION联合函数来测试是否存在注入“ union select ……
”
<?php
echo '<h1>';
echo 'SQL常规回显注入环境';
echo '</h1>';
$conn=mysqli_connect('127.0.0.1', 'root', 'root');// 连接mysql
if (!$conn){//判断连接是否成功
echo '连接MySQL发生错误:'.mysqli_error($conn);
}else{
echo '成功连接MySQL!';
}
echo '<hr>';
// mysqli_select_db() -- 查询库,or die(str) -- 上一个函数执行错误则输出str
mysqli_select_db($conn, 'text') or die ("无法正确连接到数据库!");
// mysqli_query() -- 执行sql命令
// set names utf-8 -- 写入数据库采用的编码(utf-8)
mysqli_query($conn, 'set names utf-8');
// 接收参数text
if(isset($_GET['text'])){
$text=$_GET['text'];
}
// 拼接sql语句并执行
$sql="SELECT * FROM admin WHERE uid='$text' LIMIT 0,1";
echo 'SQL拼接结果:'.$sql;
echo '<hr>';
// 执行sql语句并返回结果
$result=mysqli_query($conn, $sql);
$row=mysqli_fetch_array($result, MYSQLI_BOTH);
if ($row){ //回显结果
echo '<table>';
echo '<tr>';
echo '<td>UID</td><td>NAME</td><td>PASS</td>';
echo '</tr><tr>';
echo '<td>'.$row['uid'].'</td>';
echo '<td>'.$row['name'].'</td>';
echo '<td>'.$row['pass'].'</td>';
echo '</tr>';
echo '</table>';
}
?>
' union select 1,database(),version(),4; -- +
报错注入
报错注入类型是泛指应用页面不返回内容数据,无法从回显结果获得信息;但是一般应用都会保留SQL的查询报错mysqli_error()
通过“extractvalue
UpdateXml
foot
”等函数来查询,但是无法查询到结果并会通过报错的方式返回结果。
<?php
echo '<h1>';
echo 'SQL报错注入环境';
echo '</h1>';
$conn=mysqli_connect('127.0.0.1', 'root', 'root');// 连接mysql
if (!$conn){//判断连接是否成功
echo '连接MySQL发生错误:'.mysqli_error($conn);
}else{
echo '成功连接MySQL!';
}
echo '<hr>';
// mysqli_select_db() -- 查询库,or die(str) -- 上一个函数执行错误则输出str
mysqli_select_db($conn, 'text') or die ("无法正确连接到数据库!");
// mysqli_query() -- 执行sql命令
// set names utf-8 -- 写入数据库采用的编码(utf-8)
mysqli_query($conn, 'set names utf-8');
if(isset($_GET['text'])){
$text=$_GET['text'];// 接收参数text
}
$sql = "SELECT * FROM admin WHERE uid = '$text';";
echo $sql."<hr>";
$result = mysqli_query($conn, $sql )
or die( '<pre>' . mysqli_error($conn) . '</pre>');
//mysqli_error -- 返回最近调用函数的最后一个错误描述
$row=mysqli_fetch_array($result, MYSQLI_BOTH);
if($row){
echo '<table>';
echo '<tr>';
echo '<td>UID</td><td>NAME</td><td>PASS</td>';
echo '</tr><tr>';
echo '<td>'.$row['uid'].'</td>';
echo '<td>'.$row['name'].'</td>';
echo '<td>'.$row['pass'].'</td>';
echo '</tr>';
echo '</table>';
}
?>
' and updatexml(1,concat(0x7e,database(),0x7e,version()),1); -- +
盲注
盲注类型泛指无法利用回显测试等情况,进行的一种sql注入测试方法。
盲注主要分为两种:
- 布尔盲注:通过判断页面响应确定是否正确的布尔sql拼接。
- 时间盲注:通过sql查询的时间延迟
sleep
函数来测定构造的布尔sql是否成立。
<?php
echo '<h1>';
echo 'SQL常规盲注环境';
echo '</h1>';
$conn=mysqli_connect('127.0.0.1', 'root', 'root');// 连接mysql
if (!$conn){//判断连接是否成功
echo '连接MySQL发生错误:'.mysqli_error($conn);
}else{
echo '成功连接MySQL!';
}
echo '<hr>';
// mysqli_select_db() -- 查询库,or die(str) -- 上一个函数执行错误则输出str
mysqli_select_db($conn, 'text') or die ("无法正确连接到数据库!");
// mysqli_query() -- 执行sql命令
// set names utf-8 -- 写入数据库采用的编码(utf-8)
mysqli_query($conn, 'set names utf-8');
if(isset($_GET['text'])){
$text=$_GET['text'];// 接收参数text
}
$sql = "SELECT * FROM admin WHERE uid = '$text';";
echo $sql."<hr>";
$result = mysqli_query($conn, $sql ) ;
$row=mysqli_fetch_array($result, MYSQLI_BOTH);
if($row){
echo '查询结果存在!';
// echo '查询完成';
} else {
echo '查询结果不存在!';
// echo '查询完成';
}
/*
如上源码,当echo返回结果为第一类情况则适用布尔盲注的方法不断的猜结
当echo返回结果为第二类情况则适用时间盲注,通过时间延迟的方式来判断布尔结果并不断的猜解
*/
?>
- 布尔盲注测试
' or left(database(),2)='te'; -- +
- 时间盲注测试
if(ascii(substr(database(),1,1))='t',1,sleep(10)); -- +
宽字节注入
环境构造注意:该注入环境要求mysql数据库采用GBK编码;宽字节注入与HTML页面编码是无关的,即HTML页面是UTF-8编码,只要mysql是GBK都可以存在宽字节注入;
参考文章:PHP宽字节注入 浅谈对宽字节注入的认知
<?php
echo '<h1>';
echo 'SQL宽字节注入环境';
echo '</h1>';
$conn=mysqli_connect('127.0.0.1', 'root', 'root');// 连接mysql
if (!$conn){//判断连接是否成功
echo '连接MySQL发生错误:'.mysqli_error($conn);
}else{
echo '成功连接MySQL!';
}
echo '<hr>';
// mysqli_select_db() -- 查询库,or die(str) -- 上一个函数执行错误则输出str
mysqli_select_db($conn, 'text') or die ("无法正确连接到数据库!");
// mysqli_query() -- 执行sql命令
// set names utf-8 -- 写入数据库采用的编码(utf-8)
mysqli_query($conn, 'set names gbk');
// 接收参数text
if(isset($_GET['text'])){
$text=$_GET['text'];
}
// 拼接sql语句并执行
$sql="SELECT * FROM admin WHERE uid='$text' LIMIT 0,1";
echo 'SQL拼接结果:'.$sql;
echo '<hr>';
// 执行sql语句并返回结果
$result=mysqli_query($conn, $sql);
$row=mysqli_fetch_array($result, MYSQLI_BOTH);
if ($row){ //回显结果
echo '<table>';
echo '<tr>';
echo '<td>UID</td><td>NAME</td><td>PASS</td>';
echo '</tr><tr>';
echo '<td>'.$row['uid'].'</td>';
echo '<td>'.$row['name'].'</td>';
echo '<td>'.$row['pass'].'</td>';
echo '</tr>';
echo '</table>';
}
?>
登录框注入
登录框注入泛指sql直接无任何的过滤直接拼接用户名和密码来从数据库中直接查询结果并实现登录等系列功能;攻击者利用这一缺陷,直接构造一个sql之后可以越过密码的确认,也就是俗称的万能密码“admin '--+
”
<!DOCTYPE html>
<html>
<head>
<title>SQL_login注入测试</title>
<meta charset="utf-8"/>
</head>
<body>
<form action="./sql_login.php" method="post">
<div>
用户名:<input type="text" name="name" />
</div>
<div>
密码:<input type="password" name="pass" />
</div>
<input type="submit" value="提交" />
</form>
<div>
<?php
$conn=mysqli_connect('127.0.0.1', 'root', 'root');// 连接mysql
if (!$conn){//判断连接是否成功
echo '连接MySQL发生错误:'.mysqli_error($conn);
}else{
echo '成功连接MySQL!';
}
echo '<hr>';
// mysqli_select_db() -- 查询库,or die(str) -- 上一个函数执行错误则输出str
mysqli_select_db($conn, 'text') or die ("无法正确连接到数据库!");
// mysqli_query() -- 执行sql命令
// set names utf-8 -- 写入数据库采用的编码(utf-8)
mysqli_query($conn, 'set names utf-8');
// 接收参数name pass
$name=$_POST['name'];
$pass=$_POST['pass'];
// echo $name . "~" . $pass;
// 拼接sql语句并执行
$sql="SELECT * FROM admin WHERE name='$name' and pass='$pass' LIMIT 0,1";
echo 'SQL拼接结果:'.$sql;
echo '<hr>';
// 执行sql语句并返回结果
if($result=mysqli_query($conn, $sql)){
$row=mysqli_fetch_array($result, MYSQLI_BOTH);
if ($row){ //回显结果
echo '<table>';
echo '<tr>';
echo '<td>UID</td><td>NAME</td><td>PASS</td>';
echo '</tr><tr>';
echo '<td>'.$row['uid'].'</td>';
echo '<td>'.$row['name'].'</td>';
echo '<td>'.$row['pass'].'</td>';
echo '</tr>';
echo '</table>';
} else {
echo "用户名或密码错误";
}
}
?>
</div>
</body>
</html>
admin'; -- +