
PHP
文章平均质量分 82
My6n
我们会毁灭于我们所热爱的东西
展开
-
ctfshow-web入门-反序列化(web271-web278)
laravel 反序列化漏洞。public$admin=false; admin 默认是 false ,我们需要修改它为 true 才会进入 system。但是这里无法直接修改,我们可以采用 phar 文件来触发,当读取 phar 文件时,会自动反序列化 manifest 中的字符串,采用 phar 协议来读取即可。原创 2024-11-11 12:58:44 · 836 阅读 · 0 评论 -
ctfshow-web入门-反序列化(web265-web270)
_destruct() 在对象被销毁时会自动调用,我们只需要让 ctfshow 类正确被反序列化即可,但是直接传 ctfshow 会被检测,之后就会抛出异常,如果程序报错或者抛出异常就不会触发 __destruct() 了,因为 throw 那个函数回收了自动销毁的类,导致 __destruct() 检测不到有东西销毁,从而也就无法触发 __destruct()。拿到 flag:ctfshow{f5b30e4e-16e1-4fb2-ad07-c75c6c069453}admin/admin 可以登录。原创 2024-11-09 13:11:57 · 680 阅读 · 0 评论 -
ctfshow-web入门-反序列化(web260-web264)
session.serialize_handler 是用来设置 session 序列化引擎的,在 5.5.4 前默认是 php,5.5.4后默认是 php_serialize,在 PHP 反序列化存储的 $_SESSION 数据时如果使用的引擎和序列化时使用的引擎不一样,就会导致数据无法正确第反序列化,也就是 session 反序列化漏洞。要求传入的内容序列化后包含指定内容即可,在 PHP 序列化中,如果键名或值包含 ctfshow_i_love_36D,那么整个序列化结果也会包含这个字符串。原创 2024-11-08 13:04:46 · 1564 阅读 · 0 评论 -
ctfshow-web入门-反序列化(web254-web258)
通过反射调用私有变量。这里 code 和 class 都成了公有变量,我们可以直接访问到,只是增加了正则过滤,匹配的是大小写 o 或者 c:数字: 这种形式的内容,我们在数字前添加 + 绕过。原创 2024-10-18 16:56:03 · 1436 阅读 · 0 评论 -
ctfshow-web入门-php特性(web147-web150_plus)
:匹配字符串的开头。$:匹配字符串的结尾,确保整个字符串符合规则。[a-z0-9_]:表示允许小写字母、数字和下划线。*:匹配零个或多个前面的字符。/i:忽略大小写。s:匹配包括换行符在内的所有字符。D(PCRE 特有):美元符号 $ 仅匹配字符串的实际末尾,不匹配结尾的换行符。这里只需要让 $ctfshow 里面有其他字符即可满足 if 判断。在 PHP 中,命名空间(namespace)提供了一种组织代码的方式,可以避免类、函数和常量名称的冲突。原创 2024-07-27 15:54:21 · 1875 阅读 · 0 评论 -
ctfshow-web入门-php特性(web142-web146)
要求 v1 是数字,之后将 v1乘以 0x36d(即16进制的869)五次,然后将结果转换为整数并赋值给变量 $d,使用 sleep 函数使程序休眠 $d 秒,最后读取flag.php文件的内容并输出到浏览器。在 web141 的基础上新增过滤加减、取反、或,我们可以使用乘除号代替加减号,取反、或不能使用我们还可以采用异或运算构造 payload。这里过滤的是异或,我们采用或、取反都可以,加减乘除都被过滤,可以用位或运算符 |。这里我们先构造 ("system")("ls")原创 2024-07-27 11:44:51 · 1258 阅读 · 0 评论 -
ctfshow-web入门-php特性(web137-web141)
查看源码:拿到 flag:ctfshow{dd387d95-6fbe-4703-8ec5-9c8f9baf2bb5}在 php 中,-> 用于访问类的实例成员(属性和方法),我们需要先实例化类,然后通过实例对象来调用其成员;而 :: 用于访问类的静态成员(静态属性和静态方法)和常量,静态成员属于类本身,而不是任何具体实例,因此不需要实例化类即可调用它们。原创 2024-07-26 20:35:55 · 1642 阅读 · 0 评论 -
ctfshow-web入门-php特性(web132-web136)
mt_rand(1, 0x36D) 会生成一个 1 到 877(十六进制0x36D)的随机数,因此 $code === mt_rand(1,0x36D) 这个条件很难满足,因为每次都会生成一个新的随机数,$code 很难与这个随机数相等。tr -cd 'a-zA-Z0-9-' 这个命令会删除所有不是字母、数字、减号的内容,原本我想将大括号也保留,但是试了下不行。flag 分为了两段,flag1 和 flag2,拼接起来,字母都改成小写字母,添加上大括号即可。原创 2024-07-25 17:09:47 · 1877 阅读 · 1 评论 -
ctfshow-web入门-php特性(web127-web131)
将 $flag 变量进行 MD5 哈希运算,并将结果赋值给 $ctf_show。获取当前请求的查询字符串(query string),查询字符串是 URL 中位于问号 (?) 之后的部分,通常包含一个或多个参数和值。之后对查询字符串采用正则匹配过滤掉了一些符号,符合要求则会将 $_GET 数组中的键值对作为变量导入到当前的符号表中。换句话说,extract($_GET);会将 URL 查询参数中的每个键值对转换成同名的变量。最后要求 $ctf_show==='ilove36d' 就会输出 flag。原创 2024-07-17 14:40:10 · 995 阅读 · 0 评论 -
ctfshow-web入门-php特性(web123、web125、web126)
post 传入 CTF_SHOW 和 CTF_SHOW.COM 确保 isset($_POST['CTF_SHOW']) && isset($_POST['CTF_SHOW.COM']) 这部分条件为真,fun=eval($a[0]) 将 eval($a[0]) 的代码传递给 $c。最后 判断 if($fl0g === "flag_give_me"),因为 $fl0g 被正确地设置为了 'flag_give_me',所以这个条件为真,因此,echo $flag;原创 2024-07-16 16:27:37 · 1626 阅读 · 0 评论 -
ctfshow-web入门-php特性(web109-web115)
php 中查看目录的函数有:scandir()、golb()、dirname()、basename()、realpath()、getcwd() ,其中 scandir()、golb() 、dirname()、basename()、realpath() 都需要给定参数,而 getcwd() 不需要参数,getchwd() 函数会返回当前工作目录。对于 trim() 函数会去除空格( %20)、制表符(%09)、换行符(%0a)、回车符(%0d)、空字节符(%00)、垂直制表符(%0b),原创 2024-07-15 17:01:50 · 1507 阅读 · 0 评论 -
ctfshow-web入门-php特性(web104-web108)
需要传入的 v1 和 v2 进行 sha1 加密后相等。解法1:这里都没有判断 v1 和 v2 是否相等,我们直接传入同样的内容加密后肯定也一样。?v2=1post:v1=1拿到 flag:ctfshow{bd4eea6b-872d-462c-b8f2-20f48d3ee652}解法2:对于 php 强比较和弱比较:md5(),sha1() 函数无法处理数组,如果传入的为数组,会返回 NULL ,两个数组经过加密后得到的都是 NULL ,也就是相等的。?原创 2024-07-14 15:36:54 · 1017 阅读 · 0 评论 -
ctfshow-web入门-php特性(web100-web103)is_numeric 函数绕过
我们只需要构造输出 ctfshow 这个类即可。虽然逻辑运算符的优先级比赋值运算符要高,但是如果逻辑运算符和赋值运算符连用时,往往允许存在先进行赋值运算,后再进行逻辑运算的顺序。需要满足 if 语句才会进入后面的判断,因此要求 v0 为 1,这里用的是 and,所以只需要满足 v1是数字即可。要求 v2 中不能有分号,v3 中需要有分号。如果上述要求都满足,则会调用 eval 函数。代入 eval 函数实际就是执行:");原创 2024-07-13 17:10:44 · 1524 阅读 · 1 评论 -
ctfshow-web入门-php特性(web96-web99)
如果 $_GET 不为空,也就是说我们进行了 get 传参,那么就会通过 $_GET = &$_POST 将 $_POST 的引用赋值给 $_GET,引用赋值导致两个变量指向同一个内存地址,而 $_POST 变量内容改变会影响 $_GET 变量的内容;$_GET 变量是一个数组,预定义的 $_GET 变量用于收集来自 method="get" 的表单中的值,表单域的名称会自动成为 $_GET 数组中的键。isset()函数用于检查变量是否设置,如果设置了,则 id=$_GET['id'],否则 id=1。原创 2024-07-13 11:40:41 · 1449 阅读 · 0 评论 -
ctfshow-web入门-php特性(web89-web95)intval 函数绕过
如果第一次匹配成功,再次使用正则表达式匹配 $a 是否等于字符串“php”,但这次只有不区分大小写,是单行模式,不会匹配多行,如果第二次没有匹配成功就会输出 flag。也就是说,如果 num 中不包含数字 "0" 就会终止程序,但是还有一种情况,如果这个 0 出现在开头,虽然是找到了有 0 这个字符,但是返回位置为 0 ,if (!== 是相等运算符,在进行比较时,会先将字符串类型转化成相同,再比较,比如比较一个数字和字符串或者比较涉及到数字内容的字符串,字符串会被转换成数值并按照数值来进行比较。原创 2024-07-12 11:47:12 · 1154 阅读 · 0 评论 -
ctfshow-web入门-命令执行(web119、web120、web121、web122)
被解释成了 1,因此 ${HOME::$?这里出现了 3,放到前面的题去试了下,BASH 和 SHELL 的依旧是不行,难道都不是 /bin/bash吗,很奇怪。这里当前登录的用户名应该是 www-data,我最开构造的是 a ,取变量的最后一个字母,也就是 /bin/?原创 2024-07-03 17:18:15 · 1581 阅读 · 6 评论 -
ctfshow-web入门-命令执行(web118详解)Linux 内置变量与Bash切片
示例:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin。描述:存储一系列路径,这些路径用于查找可执行文件,当你在命令行中输入命令时,系统会在这些路径中查找对应的可执行文件。提取从第二个字符开始的两个字符,即 ro,在 Bash 中,字符串切片的索引也是从 0 开始的。以此类推,最终将这些数字应用到切片中去,绕过对数字的过滤,构造出我们想要执行的命令。在Bash中,${#var} 的语法用于获取变量 var 的长度(即字符数)。原创 2024-07-03 12:03:47 · 1368 阅读 · 0 评论 -
ctfshow-web入门-命令执行(web75-web77)
利用 mysql load_file 读文件,提示中是从数据库 ctftraining 中查询的,就算我们不知道这个数据库名,也可以直接从默认的 information_schema 中查,该数据库包含了所有的数据库的内容。(readflag 这个东西在前面的题里面遇到过,它是一个可执行的二进制文件,执行它即可获取 flag,这里为什么要用这个 readflag 而不是直接读取 flag36x.txt 我们后面再说)接下来的三个字符 r-- 表示文件所有者(root)具有读取权限,但没有写入或执行权限。原创 2024-07-01 17:16:04 · 1756 阅读 · 0 评论 -
ctfshow-web入门-命令执行(web71-web74)
我们直接在执行完 include 包含语句后执行 exit 强制退出,从而实现绕过 preg_replace 的执行。拿到 flag:ctfshow{3deb8d00-68e6-4c20-a971-3fbf3382ec45}拿到 flag:ctfshow{8fccf5bc-5681-4815-b7ce-0b81772b6f7c}拿到 flag:ctfshow{35309fb4-36c5-4080-874a-6eaa85e03ff0}才发现这道题给了 index.php 的源码。原创 2024-06-30 15:08:39 · 997 阅读 · 0 评论 -
ctfshow-web入门-命令执行(web66-web70)
先使用scandir() 进行目录扫描,对于 txt 文件,我们使用 include 进行包含就可以直接看到文件内容,ini_set用来设置php.ini的值,在函数执行的时候生效,脚本结束后,设置失效。原创 2024-06-30 13:26:51 · 797 阅读 · 0 评论 -
ctfshow-web入门-命令执行(web59-web65)
都是使用 highlight_file 或者 show_source。原创 2024-06-30 12:34:44 · 379 阅读 · 0 评论 -
ctfshow-web入门-命令执行(web56、web57、web58)
由于前面说的只有 -1,因此我们对 36 进行取反,得到 -37,对 -37 再次取反即可得到 36。这里说了 flag 在 36.php,那么我们只需要构造 36,但是数字被过滤了。根据 $((~ $(()) ))=-1,我们进行拼接,构造出 -37。命令执行,需要严格的过滤,已测试,可绕。原创 2024-06-29 22:50:49 · 1514 阅读 · 0 评论 -
ctfshow-web入门-命令执行(web53-web55)
这里的代码有点不一样,说一下这两种的区别:(1)直接执行 system($c);这种方式会直接执行命令 $c 并将命令的输出直接发送到标准输出(通常是浏览器);不会返回命令的输出值,因此不能对输出结果进行进一步处理。(2)使用一个参数来接受 system 的返回值后再输出它这种方式不仅会执行命令 $c,而且会将命令的最后一行输出结果赋值给变量 $d;然后通过 echo "".$d;将变量 $d 的内容输出到标准输出;原创 2024-06-10 18:21:24 · 1584 阅读 · 0 评论 -
ctfshow-web入门-命令执行(web43-web52)关于黑洞“ >/dev/null 2>&1“的处理与绕过
注意:我们传入的 c=%09 是 URL 编码,在 URL 编码中,%09 表示 ASCII 编码中的水平制表符(Tab 键),而不是数字 '0' 和 '9'。拿到 flag:ctfshow{f0f59065-df11-4cec-b502-fc9a7e2c48c8}拿到 flag:ctfshow{27fb4c37-7767-412f-9389-0d90b5a9a361}拿到 flag:ctfshow{f043c560-aaea-4e22-9072-e6a5eb08d059}cut:用于从文本文件中剪切列。原创 2024-06-10 14:41:52 · 1255 阅读 · 1 评论 -
ctfshow-web入门-命令执行(web42知识铺垫与四种常见截断方法)
2>&1 是另一个重定向操作符,它将标准错误(stderr)重定向到标准输出(stdout),>&1 表示将标准错误重定向到标准输出所指向的地方(即 /dev/null),这意味着命令的所有错误信息也会被丢弃。/dev/null 是类 Unix 操作系统中的一个特殊文件,被称为“空设备”或“黑洞”,它是一个字符设备文件,其主要作用是丢弃所有写入它的数据,同时任何从它读取的操作都会立即返回EOF(文件结束符)。对于一个与,前面的语句为假则直接执行后面的,前面可真可假,后面命令都会执行;原创 2024-06-09 11:16:14 · 1209 阅读 · 0 评论 -
ctfshow-web入门-命令执行(web41_exp与分析)
preg 是题目的正则匹配规则,在 ASCII 可见字符范围内,先排除掉正则表达式匹配的字符,将其他可用的字符进行按位或运算,再将运算得到的可见字符,以及参与或运算结果为可见字符的组合转为 16 进制拼接 % 后写入 txt 文件。过滤掉了数字、字母以及一些符号,之前接触过的无字母 rce 是取反编码再取反,采用不可见字符去绕过正则,但是这里取反符号被过滤掉了,但是注意到或符号被放出来了,下面附上这种类型题目的相关脚本,并给出一定解释。(2)php 可用字符生成脚本(这个的生成方式可以选择或和异或操作)原创 2024-06-08 17:41:26 · 1335 阅读 · 2 评论 -
ctfshow-web入门-命令执行(web37-web40)
中间件的日志文件会保存网站的访问记录,比如HTTP请求行,User-Agent,Referer等客户端信息,如果在HTTP请求中插入恶意代码,那么恶意代码就会保存到日志文件中,访问日志文件的时候,日志文件中的恶意代码就会执行,从而造成任意代码执行甚至获取shell。将我们想要执行的代码包含进去,其实和 php://input 是一样的,让用户可以控制输入流,当它与文件包含函数结合时,用户输入的 data:// 流就会被当作 php 文件执行。就会显示容器有问题了。我们也可以采用编码绕过,对原创 2024-06-07 17:25:56 · 2276 阅读 · 0 评论 -
ctfshow-web入门-命令执行(web30-web36)
命令执行,需要严格的过滤。原创 2024-06-06 15:57:16 · 1399 阅读 · 1 评论 -
ctfshow-web入门-命令执行(web29)五种解法绕过文件名检测
它的 payload 里用到了两个连续的单引号,在一些系统中,连续的两个单引号会被解释为一个单引号,而不会被视为字符串的结尾,从而使得字符串拼接在一起。因此,"fl''ag.php" 被解释为 "flag.php",从而绕过对文件名的检测。第一题代码很简单,就是对 preg_match 绕过,只要提交的参数值不出现 flag 就行。这条命令的作用是输出指定文件的内容,并在每一行前面加上行号。可以看到 flag 就在当前目录下,叫 flag.php。写入成功,这里还是测了一会儿才弄好,注意对单引号的转义。原创 2024-06-06 11:44:03 · 791 阅读 · 0 评论 -
关于 CTF 中 php 考点与绕过那些事的总结
_POST //获取post数据,是一个字典$_GET //获取get数据,是一个字典$_COOKIE //获取cookie数据$_SESSION //获取session数据$_FILES //获取上传的文件$_REQUEST //获取$_GET, $_POST, $_COOKIE中的数据$_SERVER //用户和服务器的基本信息数据库$_ENV //环境数据$GLOBALS //所有全局变量。原创 2024-03-04 23:58:26 · 4024 阅读 · 1 评论 -
php反序列化之pop链构造(基于重庆橙子科技靶场)
_toString() //当对象被当做字符串时自动调用(找echo $this->a这种、strtolower()等)__get() //调用类中不存在变量时触发(找有连续箭头的 this->a->b)__invoke() //对象被当做函数进行调用时触发(找有括号的类似$a()这种)__isset() //在不可访问的属性上调用isset()或empty()触发。__unset() //在不可访问的属性上使用unset()时触发。原创 2024-01-16 15:49:52 · 1499 阅读 · 1 评论 -
关于PhpStorm的安装与汉化
解压后在scripts目录下找到uninstall-all-user.vbs,双击打开,点击确定会看到done。根据以往经验,一般这种都需要配置环境变量,因此将添加bin到path也勾上。查看一下环境变量,可以看到php的环境变量被自动添加了。因为我是第一次使用这个软件,因此选择第二个,点击OK。可以免费使用30天,也可以购买,下面我们介绍如何激活。如果刚才没有勾选添加,则需要手动添加bin路径进去。至此,phpstorm已经成功激活。这里php自动添加到的是用户变量。下载好后,双击exe安装程序。原创 2024-01-10 13:08:08 · 1507 阅读 · 1 评论 -
BUUCTF--[ACTF2020 新生赛]Include
确实过滤掉了很多伪协议,但是 php://filter 是可以使用的,这也是为什么我们能读取到flag.php。php://filter/read=convert.base64-encode/resource=[文件名]请求了file,内容是flag.php的内容:Can you find out the flag?但是这种编码读取php文件似乎不行,不过我们可以读其他的,比如etc下的passwd。应该是被检测了,我们读取一下index.php的源码看看。,这时我们就需要使用一些其他的编码方式。原创 2023-11-21 13:59:24 · 1535 阅读 · 0 评论 -
[HCTF 2018]WarmUp全网最详细解释
对'hint.php'执行mb_substr函数,但是函数内一个参数是来自另一个函数mb_strpos的返回值,因此我们先看mb_strpos函数,使用.进行字符连接,即连接了一个问号字符 '?',得到hint.php?因为我们当前的source.php一般是在html目录下,往上是www,var,然后到根目录,flag一般就放在根目录下面,这里还有一个hint.php?检查'hint.php'是否在白名单中(白名单包括hint.php和source.php),在,继续执行后面的代码;原创 2023-11-08 15:18:38 · 7918 阅读 · 19 评论 -
CTF之PHP特性与绕过
A.A被传到URL中是A.A,但是到了php里面则会被转换为A_A,即保证了参数的传递,也避免了被strpos函数查找到;并且,在PHP8之前,如果参数中出现中括号[,那么中括号会被转换成下划线_,但是会出现转换错误,导致如果参数名后面还存在非法字符,则不会继续转换成下划线。在给参数传值时,如果参数名中存在非法字符,比空格和点,则参数名中的点和空格等非法字符都会被替换成下划线。isset()函数用于检查变量是否设置,如果设置了,则 id=$_GET['id'],否则 id=1。原创 2023-11-01 14:54:31 · 1723 阅读 · 0 评论 -
NewStarCTF2023week4-More Fast(GC回收)
当一个类创建之后它会自己消失,而 __destruct() 魔术方法的触发条件就是一个类被销毁时触发,而throw那个函数就是回收了自动销毁的类,导致destruct检测不到有东西销毁,从而也就导致无法触发destruct函数。当然这里保险一点的做法是先执行 ls 命令,然后再使用 ../../../ 进行目录穿越 ,找到flag所在目录,再进行 cat,并且这里过滤了关键字 flag,因此我们使用通配符 * 进行匹配。打开链接,存在很多个类,很明显是php反序列化漏洞利用,需要构造pop链 ,原创 2023-10-24 18:44:46 · 1471 阅读 · 5 评论 -
NewStarCTF2023week4-逃(反序列化字符串逃逸)
在反序列化的时候php会根据s所指定的字符长度去读取后边的字符,由于在序列化操作后又使用了str_replace()函数进行字符串替换,这就可能会改变字符串的长度,比如上面将bad替换为good,每替换掉一个bad,字符串长度明显就增加了1,而由于序列化之后s的值没变,但是进行了内容替换,改变了字符串长度,那么反序列化读取时,就并不能将原本的内容读取完全。得到:O:7:"GetFlag":2:{s:3:"key";而后面没有被读到的内容,也就是逃逸出来的字符串,就会被当做当前类的属性被继续执行。原创 2023-10-24 00:44:37 · 1270 阅读 · 2 评论 -
NewStarCTF2023week2-R!!C!!E!!(非常详细完整解题全过程)
preg_replace 函数:执行一个正则表达式的搜索和替换,\w表示非单词字符,单词字符包括:a-z、A-Z、0-9,以及下划线,加上取非^就成了匹配所有的单词字符,+表示可以进行多个匹配,还匹配了左括号和右括号 ,((?先用 getallheaders() 获取全部请求头信息,再用 array_flip() 反转键值,即将 ls / 放到键名的位置,因为 array_rand 是随机取一个键名,反转之后获取到的就是命令,如果没有进行反转,获取到的就是myon。4、源码泄露,常见的有:HG泄露;原创 2023-10-15 17:27:45 · 1484 阅读 · 6 评论 -
NewStarCTF2023week2-Unserialize?
创建了一个 evil 对象并设置了 cmd 属性,然后对对象进行了序列化。但要注意,在 PHP 中,如果一个类包含私有属性,并且你尝试序列化该对象,私有属性的值将不会被包括在序列化结果中。因此,在反序列化时,你无法访问 cmd 属性的值,因为它不会被正确反序列化。定义了一个eval类,该类下有一个私有变量cmd和公有成员函数destruct(),该函数在对象的所有引用都被删除或类被销毁时会自动调用;如果满足if条件,没有被匹配到,则会调用system函数,执行我们传入的cmd内容;在根目录下找到flag。原创 2023-10-15 00:08:04 · 6834 阅读 · 0 评论 -
NewStarCTF2023week2-include 0。0
构造payload:?构造payload:?因为flag在flag.php,并且这里过滤掉了base和rot,没关系我们使用其他编码方式输入输出即可。回到这道题,我先尝试的是使用php://input(用于执行PHP代码)1、flag在flag.php。原创 2023-10-14 10:48:55 · 1063 阅读 · 1 评论