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

常见的sql注入环境搭建的更多相关文章

  1. SQL注入环境的搭建

    使用Phpstudy搭建SQL注入环境: 1.下载phpstudy安装 2.下载sql实验环境 所用环境的代码是一个印度人的开源项目平台.里面包含了基本的各种注入类型,同时又有get和post类型,以 ...

  2. 常见的SQL注入检测语句(转载)

    0x00 前言 现在很多WAF都能拦截sqlmap.havij 等注入工具的发包注入,所以这时我们需要在浏览器上使用hackerbar 进行手工注入,或者说是手工绕过注入攻击 0x01 发现SQL 注 ...

  3. AlwaysOn可用性组测试环境安装与配置(一)--SQL群集环境搭建

    一.测试环境介绍 1. 宿主使用工作站(HYPR-V)基本配置如下: 处理器:Intel(R) Core(TM) i5-4470 CPU @ 3.20GHz 3.20GHz 内存(RAM):8.00G ...

  4. 初探SQL注入需要知道的5个问题

    SQL注入产生原理 可控变量(注入点,就是传参) 带入数据库查询 变量未存在过滤或过滤不严谨 例子: 获取admin表的pass里面的数据 select * from users where id=1 ...

  5. 搭建sql注入实验环境(基于windows)

    搭建服务器环境 1.下载xampp包 地址:http://www.apachefriends.org/zh_cn/xampp.html 很多人觉得安装服务器是件不容易的事,特别是要想添加MySql, ...

  6. SQL Server 学习之环境搭建

    SQL Server 环境搭建 说明:本文是sqlServer的安装和测试环境的搭建 版本是SQLServer 2005版,由于该版本只能在Windows7或者更低的系统上才能安装,更高的系统请安装S ...

  7. 代码审计之SQL注入

    0x00概况说明 0x01报错注入及利用 环境说明 kali LAMP 0x0a 核心代码 现在注入的主要原因是程序员在写sql语句的时候还是通过最原始的语句拼接来完成,另外SQL语句有Select. ...

  8. SQL注入之重新认识

    i春秋作家:anyedt 原文来自:https://bbs.ichunqiu.com/thread-41701-1-1.html 引言 作为长期占据 OWASP Top 10 首位的注入,认识它掌握它 ...

  9. SQL注入之DVWA平台测试mysql注入

    今天主要针对mysql常用注入语句进行测试. 测试环境与工具: 测试平台:DVWA,下载地址:http://down.51cto.com/data/875088,也可下载metaspolit-tabl ...

随机推荐

  1. 最适合 Python 入门的资源有哪些?

    https://blog.csdn.net/zV3e189oS5c0tSknrBCL/article/details/81230593 学习任何一门编程语言或者技能基本上都遵循3个步骤,第一步是看,第 ...

  2. 2013-2-1 pdf中无法用金山词霸取词问题

    打开pdf的编辑——〉首选项——〉一般——〉选项——〉开始——〉只有经过认证的插件,把‘checkbox’里的勾去掉,重启. ★在acrobat reader启动画面里如果没有加载xdict32(工具 ...

  3. 装机必备 Windows 操作系统ISO镜像资源

    小编今天使用VMware虚拟机软件搭建Win7系统时,开始一直不成功总是出现:Start booting from CD...Directory "EZBOOT" not foun ...

  4. Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:2.1.3.RELEASE:repackage (repackage)

    解决方案是删除 pom.xml配置的问题 <build> <plugins> <plugin> <groupId>org.springframework ...

  5. java线程与进程的比较

    线程具有许多传统进程所具有的特征,故又称为轻型进程(Light—Weight Process)或进程元:而把传统的进程称为重型进程(Heavy—Weight Process),它相当于只有一个线程的任 ...

  6. Class对象的isAssignableFrom方法

    isAssignableFrom 在看一个开源代码时,在加载完某个Class对象后,经常会使用 java.lang.Class#isAssignableFrom 来校验下. 之前真没有注意过Class ...

  7. js执行代码顺序

    之前一直停留在主线程先执行,异步后执行的浅理解中,后来随着不断的学习,才渐渐意识到这里面还是有点复杂的,不过我不打算写很多.一幅图来说明这个复杂的关系 processTick可理解为node中的延时器 ...

  8. 【38.96%】【hdu 1540】Tunnel Warfare

    Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission ...

  9. Common Logging包装设计

    类设计 LogFactory根据当前环境加载具体的Log实现: 1.从缓存中加载LogFactory 2.从系统属性org.apache.commons.logging.LogFactory 中加载L ...

  10. logisim自动生成电路

    之前再做有关logisim有关的实验时,一直在傻乎乎地连线,而我是看了mooc有关的视频时,才知道logisim有自动连线的功能. 自动连线需要事先知道输入与输出的真值表或者全部的表达式,将其填入lo ...