常见的sql注入环境搭建

By : Mirror王宇阳

 

1|1PHP+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();//返回报错信息

1|2常规回显注入

 

回显注入类型是指我们的查询内容会被应用回显到页面中;一般情况下回显注入回利用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; -- +

1|3报错注入

 

报错注入类型是泛指应用页面不返回内容数据,无法从回显结果获得信息;但是一般应用都会保留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); -- +

1|4盲注

 

盲注类型泛指无法利用回显测试等情况,进行的一种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)); -- +

1|5宽字节注入

 

环境构造注意:该注入环境要求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>'; } ?>

1|6登录框注入

 

登录框注入泛指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'; -- +

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值