常见的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'; -- +

SQL注入是一种常见的网络安全攻击,攻击者通过在Web表单或查询字符串中输入恶意SQL代码,来获取、修改或删除数据库中的数据。搭建SQL注入攻击环境通常涉及以下几个步骤: 1. **选择平台**: - 你可以使用虚拟机(如Vagrant或Docker)来创建一个干净的开发环境,这样可以隔离真实生产环境。 - 或者在本地服务器上安装Web服务器(如Apache或Nginx),数据库(如MySQL、PostgreSQL)。 2. **设置基础环境**: - 安装Web服务器软件,并配置基本的HTML和PHP/ASP.NET(取决于你的目标语言)页面来接收用户输入。 - 配置数据库连接,确保在代码中使用了参数化查询或者直接拼接SQL语句(这将容易受到注入攻击)。 3. **创建漏洞示例**: - 创建一个可接收用户输入的表单或URL参数,比如搜索功能或登录验证。 - 编写代码,使得用户提供的值直接插入到SQL查询中,没有进行充分的过滤或转义。 4. **编写恶意输入**: - 学习一些基本的SQL注入技巧,例如使用单引号(')关闭预定义的参数,或者利用SQL注释 (`--` 或 `/* */)来改变查询结构。 5. **测试注入**: - 使用实际的SQL注入工具(如SQLMap、Burp Suite等)或手动构造SQL语句,尝试执行非法操作,如读取敏感信息、修改数据等。 6. **安全防范措施**: - 了解如何防止SQL注入,包括使用参数化查询、预编译语句、ORM框架的内置保护机制,以及数据库层面的参数绑定等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值