2025 Win Homework 0
一、PHP语言基础
由于之前写过PHP笔记,这里的PHP知识作为补充(一)php基础1
知识链接:https://github.com/natro92/HnuSec-Training-Website/blob/main/docs/file/PHP1.pdf
- 通过函数修改全局变量要在变量前加上global
- 常量名不加$修饰符
- 常量定义:
- bool define ( string $name , mixed $value [, bool $case_insensitive = false ] )
- name:必选参数,常量名称,即标志符。
- value:必选参数,常量的值。
- case_insensitive:可选参数,如果设置为 TRUE,该常量则大小写不敏感,默认是大小写敏感的
- GLOBALS:
- $GLOBALS 是PHP的一个超级全局变量组,在一个PHP脚本的全部作用域中都可以访问。
- $GLOBALS 是一个包含了全部变量的全局组合数组。变量的名字就是数组的键。
- $_SERVER:
- 1$_SERVER 是一个包含了诸如头信息(header)、路径(path)、以及脚本位置(script locations)等等信息的数组。这个数组中的项目由 Web 服务器创建
- $_POST:
$_POST 来收集表单中的 input 字段数据
- extract:
- extract 函数可以将数组中的元素导入到当前作用域中作为变量。如果数组中的键与当前作用域中已有的变量名相同,可能会导致变量覆盖。
- list:
- list() 函数用于将数组中的值赋给一组变量
- parse_str:
- parse_str() 函数用于解析 URL 查询字符串,并将其中的参数赋值给相应的变量
- compact:
- compact() 函数用于将多个变量转换为关联数组,其中变量名将成为数组的键,变量的值将成为数组的值
- var_dump:
- var_dump是一个调试函数,用于输出变量的详细信息,包括类型和值。
- 它可以用于调试目的,帮助开发者了解变量的结构和内容
- basename() 函数用于返回路径中的文件名部分。它可以用于确保文件名只包含合法的字符,并且不包含路径信息。
- preg_replace():
- preg_replace() 函数可以使用正则表达式替换文件名中的不合法字符。通过使用适当的正则表达式,可以从文件名中去除非法字符或将它们替换为其他字符。
- str_replace():
- str_replace() 函数可以用于简单的字符串替换。虽然不如正则表达式强大,但在某些情况下也可以用来去除特定字符
- filter_var():
- filter_var() 函数可以用于过滤文件名中的非法字符。使用FILTER_SANITIZE_STRING 过滤器可以删除文件名中的非法字符。
- pathinfo() :
- pathinfo() 函数可以用于获取文件路径的信息,包括文件名、目录名和文件扩展名(后缀)等。通过
- pathinfo() 获取文件后缀,并与允许的后缀列表进行比较。
- strtolower() :
- 在检查文件后缀时,为了避免大小写问题,通常会将后缀转换为小写(或大写)后再进行比较。
- include()
- 将外部文件引入到当前的 PHP脚本中
(二)php基础2
芝士~链接:[https://github.com/natro92/HnuSec-Training-Website/blob/main/docs/file/PHP2.pdf](https://github.com/natro92/HnuSec-Training-Website/blob/main/docs/file/PHP2.pdf)- 类与对象等参考C语言
- __construct()
- 实例化类时自动调用
- __destruct()
- 类对象使用结束时自动调用
- __set()
- 在给未定义的属性赋值时自动调用
- __get()
- 调用未定义的属性时自动调用
- __isset()
- 使用 isset() 或 empty() 函数时自动调用
- __unset()
- 使用 unset() 时自动调用
- __sleep()
- 使用 serialize 序列化时自动调用
- __wakeup()
- 使用 unserialize 反序列化时自动调用
- __call()
- 调用一个不存在的方法时自动调用
- __callStatic()
- 调用一个不存在的静态方法时自动调用
- __toString()
- 把对象转换成字符串时自动调用
- __invoke()
- 当尝试把对象当方法调用时自动调用
- __set_state()
- 当使用 var_export() 函数时自动调用,接受一个数组参数
- __clone()
- 当使用 clone 复制一个对象时自动调用
- __debugInfo()
- 使用 var_dump() 打印对象信息时自动调用
- __autoload()
- 尝试加载未定义的类
二、写题
(一)[极客大挑战 2019]BabySQL
先尝试万能密码
不出所料,不是那道签到题,96dfc323c6b7d07e82ed08e6d01a894a试了用任何方法都解不开,都是乱码,万能密码用不了

这个万能密码方法只能放弃,毕竟这道题考的是sql注入,不可能这么简单
尝试随便输入几个
08-ed8dcfe1de5d.png)
到输入这个的时候出现了下面的报错信息,至少让我们知道了sql的闭合条件’1’’’,去掉左右两边的单引号得到1’’,再去掉1’,得到闭合体条件就是一个单引号’
style=”color:#000000;”>经过测试,它把and省略掉了,说明这个网站会过滤掉某些字符
)
尝试用一下burp看一下还有那些字符被过滤了
t>
(二)[SWPUCTF 2021 新生赛]finalrce
题目是一段PHP代码,需要绕过正则表达式。
cat命令最常见的用法查看文本文件的内容。例如,查看一个名为 file.txt的文件,可以运行以下命令:
+cat file.txt
先看if里的内容,preg_match 函数用于执行一个正则表达式匹配,末尾的/i说明 匹配不分大小写。读了代码后发现反斜杠和单引号都没有被注释掉,那么我们就可以利用这一点来绕过被禁止掉的命令当正则表达式没有过滤掉反斜杠或者单引号或者双引号,那么可以使用单引号或者双引号包裹命令(如:ls cat等)任意一个字符,只要他们不是一个整体就行,或者使用反斜杠插入到命令里面(如:ca\t c\at等)即可实现绕过可以看到的是没有过滤”|“这个符号,然后exec执行是没有回显的.
这个题目是需要用linux的一个命令,”tee“将想要执行的命令写入到一个文件里面,然后再去访问这个文件,以此来执行这个命令,简单来说,就是从标准输入读取,再写入标准输出和文件。
所以:tee 1.txt:将输出复制一份并输出到终端窗口以及写入到名为1.txt的文件中
输出重定向之后,看到有flag

之后使用类似的命令,将flllllaaaaaaggggggg文件中的内容进行查询,然后访问2.txt就可以拿到flag了

(三)[SWPUCTF 2021 新生赛]babyrce
进来之后发现有一串PHP代码

header查了资料header() 函数向客户端发送原始的 HTTP 报头。
在这里的header()的含义是:header(“Content-Type:text/html;charset=utf-8”);` 设置内容类型为 HTML ,并指定字符类型为 UTF-8。
接着看代码
如果’admin’ 的 cookie 值是否为1。如果是,它将包含(include)”../next.php” 文件,所以把请求中Cookie的值设置为1就可以拿到flag了
还有,小饼干(Small Cookies),直接burp你
设置admin的cookie值为1

出现了一个rasalghul.php文件

访问一下又来了一串PHP代码,显然可见,这个PHP代码过滤掉了空格
shell_exec($ip); 的作用是将用户输入直接传递给shell_exec(),执行系统命令,并将输出返回给用户。

先用Linux ls命令试试,输出当前目录下的文件列表

试了下打开index.php文件,又回到开始了。

可以看到,ls命令是有作用的,我们可以看到很显眼的flag文件,,所以我们只要能绕过空格限制,使用cat命令查看,就能够进行下一步了
查了资料,绕过空格的常用的方法为:
cat flag.txt
cat${IFS}flag.txt
cat$IFS$9flag.txt
cat<flag.txt
cat<>flag.txt
所以传入?url=cat${IFS}/flllllaaaaaaggggggg得到flag
(四)[ACTF2020 新生赛]Exec
先尝试ping自己,没有flag,

随便试了一下错的,丢包率100%,hhhhhh

试试看是否过滤了分号:127.0.0.1;ls;

发现没有过滤分号,但是呢,相比传入127.0.0.1,多了一个文件index.php,所以尝试切换到上一级目录看一下接着我们就遍历目录了,通过cd …/达到访问上一个目录的目的,再通过ls 达到查看该目录有哪些文件
没有什么信息,在往上看

没有什么信息,在往上看 还往上看神马,flag不久在这里?抓住它不久行了吗?

找到flag:flag{9002c8ac-2096-4a00-b0a7-99b6d4c71fab}

(五)[SWPUCTF 2022 新生赛]webdog1__start
一进去灵魂提问,好好好
查找网页源代码,发现这一段PHP代码,这个考的应该是md5绕过

想着用之前写题的思路,使用数组绕过,下面有一行小字发生了变化,拷问我How do you think?应该是错了,
MD5之后的数组返回值是null,肯定不等于

变量等于md5的变量这里的思路是让他们都为0e来触发0e计数法接着相等
查了资料,自身与md5相等对于0e215962017,md5后也是以0e开头,可以尝试用它绕过
看,成功了,出现一下的东西:

这里出现了很多链接,除了第一个链接是一篇文章,其余都是404
“Next”do you know the power of bot? go go go!!
“下一个”你知道机器人的力量吗?去吧,去吧!!
去robots.txt的路径看一看,发现是一堆乱码
乱码中夹杂着f14g.php
有一个网址,看看
好好好,弔图一张
那别怪我burp你了
找到F1l1l1l1l1lag.php文件,打开看一下还是PHP代码是一段代码审计

这里主要限制是过滤了flag和空格以及有18个字符的限制
if(!strstr($get,” “))
检查 $get 中是否包含空格,如果包含,则直接拒绝。
$get = str_ireplace(“flag”, “ “, $get);
把输入中的字符串 flag(大小写不敏感)替换为空格。
if (strlen($get) > 18){
die(“This is too long.”);}
如果输入的长度超过 18 个字符,终止代码。
既然空格被过滤了,那我们可以尝试使用同为空白字符的制表符%09,代替空格
所以传入system(“cat%09/f*”);
拿到flag:NSSCTF{0cca4d05-2ad2-4a90-9897-dbe875454267}
这道题这个文章讲的很详细,有很多芝士~点可以学习:http://www.coreui.cn/news/171523.html
(六)[SWPUCTF 2022 新生赛]奇妙的MD5
奇妙的字符串,又跟 MD5 有关,查了资料,找到了两个:一个是 MD5 加密后弱比较等于自身,这个字符串是 0e215962017 :
另一个是 MD5 加密后变成万能密码,这个字符串是 ffifdyopstyle=”color:#000000;”>0e215962017不行,ffifdyop才出现这个页面

这不在源代码这里找吗?
md5数组绕过

url出现了奇怪的东西

访问一下

同样数组绕过,拿到flag:NSSCTF{d2e1d7ef-32ab-4d1c-a1e2-0ea1349d610d}










