一、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

先尝试万能密码

![](/img/HnuSecTraining/2025 Win Homework 0/1736519153630-3f9a91f6-5930-432d-843d-9c9180015499.png)

不出所料,不是那道签到题,96dfc323c6b7d07e82ed08e6d01a894a试了用任何方法都解不开,都是乱码,万能密码用不了

![](/img/HnuSecTraining/2025 Win Homework 0/1736519454073-4830fa0b-c9f3-425b-a36c-9bd766d4f375.png)

这个万能密码方法只能放弃,毕竟这道题考的是sql注入,不可能这么简单

尝试随便输入几个

![](/img/HnuSecTraining/2025 Win Homework 0/1736520608655-72edbb33-ca11-428d-bafa-647480e19912.png)08-ed8dcfe1de5d.png)

到输入这个的时候出现了下面的报错信息,至少让我们知道了sql的闭合条件’1’’’,去掉左右两边的单引号得到1’’,再去掉1’,得到闭合体条件就是一个单引号’

![](/img/HnuSecTraining/2025 Win Homework 0/1736520534822-8a7e9851-84e7-48f3-a970-2b4012c4d20d.png)style=”color:#000000;”>经过测试,它把and省略掉了,说明这个网站会过滤掉某些字符

![](/img/HnuSecTraining/2025 Win Homework 0/1736521114846-b0a75543-dd8a-48cf-b2b2-ca60d4b56eed.png))

尝试用一下burp看一下还有那些字符被过滤了

![](/img/HnuSecTraining/2025 Win Homework 0/1736570728596-5f58e1bb-312d-49aa-8f00-b4830df71556.png)t>

(二)[SWPUCTF 2021 新生赛]finalrce

![](/img/HnuSecTraining/2025 Win Homework 0/1736597845911-dd49e667-6fd9-4238-a911-164066019025.png)

题目是一段PHP代码,需要绕过正则表达式。

![](/img/HnuSecTraining/2025 Win Homework 0/1736597837872-ce7eb4e7-b15e-4013-ad39-3ab3560043b2.png)cat命令最常见的用法查看文本文件的内容。例如,查看一个名为 file.txt的文件,可以运行以下命令:

+cat file.txt

先看if里的内容,preg_match 函数用于执行一个正则表达式匹配,末尾的/i说明 匹配不分大小写。读了代码后发现反斜杠和单引号都没有被注释掉,那么我们就可以利用这一点来绕过被禁止掉的命令当正则表达式没有过滤掉反斜杠或者单引号或者双引号,那么可以使用单引号或者双引号包裹命令(如:ls cat等)任意一个字符,只要他们不是一个整体就行,或者使用反斜杠插入到命令里面(如:ca\t c\at等)即可实现绕过可以看到的是没有过滤”|“这个符号,然后exec执行是没有回显的.

这个题目是需要用linux的一个命令,”tee“将想要执行的命令写入到一个文件里面,然后再去访问这个文件,以此来执行这个命令,简单来说,就是从标准输入读取,再写入标准输出和文件。

所以:tee 1.txt:将输出复制一份并输出到终端窗口以及写入到名为1.txt的文件中![](/img/HnuSecTraining/2025 Win Homework 0/1736599306986-1873fd03-6d89-4152-9ca0-aaa34e757fc6.png)

输出重定向之后,看到有flag

![](/img/HnuSecTraining/2025 Win Homework 0/1736599882646-79831275-e2c2-446f-9877-14b9a24d6972.png)

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

![](/img/HnuSecTraining/2025 Win Homework 0/1736600117584-aceb6f22-110a-46ee-9f7d-06bc76a24846.png)

(三)[SWPUCTF 2021 新生赛]babyrce

![](/img/HnuSecTraining/2025 Win Homework 0/1736677463696-0a3fec3d-3233-4ede-b18a-6701e83d99d7.png)

进来之后发现有一串PHP代码

![](/img/HnuSecTraining/2025 Win Homework 0/1736677471281-cc005a30-3a75-4bdf-b6c4-bd85e94edc59.png)

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你![](/img/HnuSecTraining/2025 Win Homework 0/1736677880412-e08481dd-b47b-4ffa-a2fc-b2151d34ad25.png)

设置admin的cookie值为1

![](/img/HnuSecTraining/2025 Win Homework 0/1736678140585-a5abd1e1-c69d-4974-80d1-4aa09bdb10c3.png)

出现了一个rasalghul.php文件

![](/img/HnuSecTraining/2025 Win Homework 0/1736678203998-f7a4fa6d-da2e-4aa3-8e32-8b9b77771715.png)

访问一下又来了一串PHP代码,显然可见,这个PHP代码过滤掉了空格

shell_exec($ip); 的作用是将用户输入直接传递给shell_exec(),执行系统命令,并将输出返回给用户。

![](/img/HnuSecTraining/2025 Win Homework 0/1736678266831-d9b81fc2-d3a2-4b7c-b008-08427a812d61.png)

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

![](/img/HnuSecTraining/2025 Win Homework 0/1736678408604-54185343-7288-4d2f-96e0-8a95231022ea.png)

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

![](/img/HnuSecTraining/2025 Win Homework 0/1736679462086-cc038d95-6155-4148-be06-75a648a1c23f.png)

可以看到,ls命令是有作用的,我们可以看到很显眼的flag文件,,所以我们只要能绕过空格限制,使用cat命令查看,就能够进行下一步了![](/img/HnuSecTraining/2025 Win Homework 0/1736678755188-25b63fdc-95a2-4405-b71d-f3f8dfdf6241.png)

查了资料,绕过空格的常用的方法为:

cat flag.txt

cat${IFS}flag.txt

cat$IFS$9flag.txt

cat<flag.txt

cat<>flag.txt

所以传入?url=cat${IFS}/flllllaaaaaaggggggg得到flag![](/img/HnuSecTraining/2025 Win Homework 0/1736679016602-55b270e4-d284-462d-82be-bfaf809c448d.png)

(四)[ACTF2020 新生赛]Exec

![](/img/HnuSecTraining/2025 Win Homework 0/1736600651502-1dc7ff11-6cde-4def-aaec-df98566db4e3.png)

先尝试ping自己,没有flag,

![](/img/HnuSecTraining/2025 Win Homework 0/1736600922279-794f0a33-4595-4c53-898c-fb15629a083d.png)

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

![](/img/HnuSecTraining/2025 Win Homework 0/1736601054735-9b580b60-22dc-47d1-b46e-fdb9b33f7fd5.png)

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

![](/img/HnuSecTraining/2025 Win Homework 0/1736601142389-bb0bd8ea-4da3-436f-8bf9-f8aa615a508a.png)

发现没有过滤分号,但是呢,相比传入127.0.0.1,多了一个文件index.php,所以尝试切换到上一级目录看一下接着我们就遍历目录了,通过cd …/达到访问上一个目录的目的,再通过ls 达到查看该目录有哪些文件![](/img/HnuSecTraining/2025 Win Homework 0/1736601320447-7b5f977b-f5bc-4a0d-8645-1d977b20f1a8.png)

没有什么信息,在往上看

![](/img/HnuSecTraining/2025 Win Homework 0/1736601397802-7559a93a-9a6d-4bfe-9cc6-2918882a265e.png)

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

![](/img/HnuSecTraining/2025 Win Homework 0/1736601426809-1f75dd15-ea2e-4f32-8ba7-15e502c97688.png)

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

![](/img/HnuSecTraining/2025 Win Homework 0/1736601700499-2f2662cf-d7ed-42c6-b0e1-6138829ac0dc.png)

(五)[SWPUCTF 2022 新生赛]webdog1__start

![](/img/HnuSecTraining/2025 Win Homework 0/1736604220579-3227a982-36ea-41d7-84a2-34742e380d36.png)

一进去灵魂提问,好好好![](/img/HnuSecTraining/2025 Win Homework 0/1736604234982-d64e3451-66a6-4876-b5fc-3e1afe8d2915.png)

查找网页源代码,发现这一段PHP代码,这个考的应该是md5绕过

![](/img/HnuSecTraining/2025 Win Homework 0/1736604429725-619e999d-87e6-4b9a-8f38-0e1017e069c0.png)

想着用之前写题的思路,使用数组绕过,下面有一行小字发生了变化,拷问我How do you think?应该是错了,

MD5之后的数组返回值是null,肯定不等于

![](/img/HnuSecTraining/2025 Win Homework 0/1736604613851-0b8949e7-559f-4f1e-b14a-9174d108402d.png)

变量等于md5的变量这里的思路是让他们都为0e来触发0e计数法接着相等

查了资料,自身与md5相等对于0e215962017,md5后也是以0e开头,可以尝试用它绕过![](/img/HnuSecTraining/2025 Win Homework 0/1736605472358-1d64ea8b-ed44-470f-a72b-df6d83109517.png)

看,成功了,出现一下的东西:

![](/img/HnuSecTraining/2025 Win Homework 0/1736605450990-344208fa-af2d-4f35-8abd-ca6f5e690f9c.png)

这里出现了很多链接,除了第一个链接是一篇文章,其余都是404

“Next”do you know the power of bot? go go go!!

“下一个”你知道机器人的力量吗?去吧,去吧!!![](/img/HnuSecTraining/2025 Win Homework 0/1736606576471-7f33ee31-d1f6-4a0b-827b-272963376f55.png)

去robots.txt的路径看一看,发现是一堆乱码![](/img/HnuSecTraining/2025 Win Homework 0/1736606663833-1e12b57c-6489-4d2c-af22-0e53360cce27.png)

乱码中夹杂着f14g.php![](/img/HnuSecTraining/2025 Win Homework 0/1736606776525-945c5e85-1fd9-496c-a2cf-4cdea7a1d98c.png)

有一个网址,看看![](/img/HnuSecTraining/2025 Win Homework 0/1736606809767-104bef09-9bc6-48ba-8e22-3aa891a94f0d.png)

好好好,弔图一张![](/img/HnuSecTraining/2025 Win Homework 0/1736606835633-5221608c-ff45-4729-a75e-4688520c2561.png)

那别怪我burp你了![](/img/HnuSecTraining/2025 Win Homework 0/1736607267463-e1dc1a6b-ad17-44ff-bd9f-c5e7e6be72b7.png)

找到F1l1l1l1l1lag.php文件,打开看一下还是PHP代码是一段代码审计

![](/img/HnuSecTraining/2025 Win Homework 0/1736607257872-f5efcdd0-f063-4a66-9d9c-c79ebd462700.png)

这里主要限制是过滤了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*”);![](/img/HnuSecTraining/2025 Win Homework 0/1736608441905-4811645c-ef74-479c-983b-2aa0cdd7f972.png)

拿到flag:NSSCTF{0cca4d05-2ad2-4a90-9897-dbe875454267}

这道题这个文章讲的很详细,有很多芝士~点可以学习:http://www.coreui.cn/news/171523.html

(六)[SWPUCTF 2022 新生赛]奇妙的MD5![](/img/HnuSecTraining/2025 Win Homework 0/1736686453403-0cb6e2c2-3683-48f1-bb6d-019632b5d049.png)

奇妙的字符串,又跟 MD5 有关,查了资料,找到了两个:

一个是 MD5 加密后弱比较等于自身,这个字符串是 0e215962017 :

另一个是 MD5 加密后变成万能密码,这个字符串是 ffifdyop![](/img/HnuSecTraining/2025 Win Homework 0/1736686600148-eb6b0c70-9732-465a-bc42-ddae4118640e.png)style=”color:#000000;”>0e215962017不行,ffifdyop才出现这个页面

![](/img/HnuSecTraining/2025 Win Homework 0/1736686671383-9696db48-e3a7-4744-9e65-334339dfb219.png)

这不在源代码这里找吗?![](/img/HnuSecTraining/2025 Win Homework 0/1736686747911-4aa0c775-fa2a-4279-87f3-89ab3141e5c7.png)

md5数组绕过

![](/img/HnuSecTraining/2025 Win Homework 0/1736686850333-4801d61e-d4af-465a-b069-b09edea0a415.png)

url出现了奇怪的东西

![](/img/HnuSecTraining/2025 Win Homework 0/1736686875495-cf956c22-70f2-466e-a2ea-1c55a0df8c15.png)

访问一下

![](/img/HnuSecTraining/2025 Win Homework 0/1736686915904-8d7cac2c-cfd0-4fb0-b595-bec766a3fba7.png)

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

![](/img/HnuSecTraining/2025 Win Homework 0/1736686988086-efe48298-c369-4689-a3a6-cb8780a02532.png)