![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
PHP
文章平均质量分 80
Myon⁶
CNVD-2024-15127报送者
国家级HVV行动蓝队处置员
成都大运会重保
公安非法网站打击渗透项目
县级攻防演练渗透测试
应急响应团队SNERT队长
工业互联网安全开发工程师
计算机网络安全隔离装置发明专利
CISCN西南赛区三等奖
ISCC个人挑战赛一等奖
第十五届软件类-网络安全网络安全大学组一等奖
四川省第二届高校网络安全技能大赛决赛优秀奖
全国大学生网络安全精英赛全国复赛优秀奖
信息安全铁人三项长城杯三等奖
第二届SWCTF二等奖
第三届SWCTF优秀出题人
全国大学生互联网+大赛银奖、铜奖
展开
-
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 · 496 阅读 · 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 · 672 阅读 · 0 评论 -
ctfshow-web入门-php特性(web100-web103)is_numeric 函数绕过
我们只需要构造输出 ctfshow 这个类即可。虽然逻辑运算符的优先级比赋值运算符要高,但是如果逻辑运算符和赋值运算符连用时,往往允许存在先进行赋值运算,后再进行逻辑运算的顺序。需要满足 if 语句才会进入后面的判断,因此要求 v0 为 1,这里用的是 and,所以只需要满足 v1是数字即可。要求 v2 中不能有分号,v3 中需要有分号。如果上述要求都满足,则会调用 eval 函数。代入 eval 函数实际就是执行:");原创 2024-07-13 17:10:44 · 893 阅读 · 0 评论 -
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 · 921 阅读 · 0 评论 -
ctfshow-web入门-php特性(web89-web95)intval 函数绕过
如果第一次匹配成功,再次使用正则表达式匹配 $a 是否等于字符串“php”,但这次只有不区分大小写,是单行模式,不会匹配多行,如果第二次没有匹配成功就会输出 flag。也就是说,如果 num 中不包含数字 "0" 就会终止程序,但是还有一种情况,如果这个 0 出现在开头,虽然是找到了有 0 这个字符,但是返回位置为 0 ,if (!== 是相等运算符,在进行比较时,会先将字符串类型转化成相同,再比较,比如比较一个数字和字符串或者比较涉及到数字内容的字符串,字符串会被转换成数值并按照数值来进行比较。原创 2024-07-12 11:47:12 · 745 阅读 · 0 评论 -
ctfshow-web入门-命令执行(web119、web120、web121、web122)
被解释成了 1,因此 ${HOME::$?这里出现了 3,放到前面的题去试了下,BASH 和 SHELL 的依旧是不行,难道都不是 /bin/bash吗,很奇怪。这里当前登录的用户名应该是 www-data,我最开构造的是 a ,取变量的最后一个字母,也就是 /bin/?原创 2024-07-03 17:18:15 · 1012 阅读 · 0 评论 -
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 · 1094 阅读 · 0 评论 -
ctfshow-web入门-命令执行(web75-web77)
利用 mysql load_file 读文件,提示中是从数据库 ctftraining 中查询的,就算我们不知道这个数据库名,也可以直接从默认的 information_schema 中查,该数据库包含了所有的数据库的内容。(readflag 这个东西在前面的题里面遇到过,它是一个可执行的二进制文件,执行它即可获取 flag,这里为什么要用这个 readflag 而不是直接读取 flag36x.txt 我们后面再说)接下来的三个字符 r-- 表示文件所有者(root)具有读取权限,但没有写入或执行权限。原创 2024-07-01 17:16:04 · 1184 阅读 · 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 · 436 阅读 · 0 评论 -
ctfshow-web入门-命令执行(web66-web70)
先使用scandir() 进行目录扫描,对于 txt 文件,我们使用 include 进行包含就可以直接看到文件内容,ini_set用来设置php.ini的值,在函数执行的时候生效,脚本结束后,设置失效。原创 2024-06-30 13:26:51 · 542 阅读 · 0 评论 -
ctfshow-web入门-命令执行(web59-web65)
都是使用 highlight_file 或者 show_source。原创 2024-06-30 12:34:44 · 229 阅读 · 0 评论 -
ctfshow-web入门-命令执行(web56、web57、web58)
由于前面说的只有 -1,因此我们对 36 进行取反,得到 -37,对 -37 再次取反即可得到 36。这里说了 flag 在 36.php,那么我们只需要构造 36,但是数字被过滤了。根据 $((~ $(()) ))=-1,我们进行拼接,构造出 -37。命令执行,需要严格的过滤,已测试,可绕。原创 2024-06-29 22:50:49 · 620 阅读 · 0 评论 -
ctfshow-web入门-命令执行(web53-web55)
这里的代码有点不一样,说一下这两种的区别:(1)直接执行 system($c);这种方式会直接执行命令 $c 并将命令的输出直接发送到标准输出(通常是浏览器);不会返回命令的输出值,因此不能对输出结果进行进一步处理。(2)使用一个参数来接受 system 的返回值后再输出它这种方式不仅会执行命令 $c,而且会将命令的最后一行输出结果赋值给变量 $d;然后通过 echo "".$d;将变量 $d 的内容输出到标准输出;原创 2024-06-10 18:21:24 · 1076 阅读 · 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 · 1047 阅读 · 1 评论 -
ctfshow-web入门-命令执行(web42知识铺垫与四种常见截断方法)
2>&1 是另一个重定向操作符,它将标准错误(stderr)重定向到标准输出(stdout),>&1 表示将标准错误重定向到标准输出所指向的地方(即 /dev/null),这意味着命令的所有错误信息也会被丢弃。/dev/null 是类 Unix 操作系统中的一个特殊文件,被称为“空设备”或“黑洞”,它是一个字符设备文件,其主要作用是丢弃所有写入它的数据,同时任何从它读取的操作都会立即返回EOF(文件结束符)。对于一个与,前面的语句为假则直接执行后面的,前面可真可假,后面命令都会执行;原创 2024-06-09 11:16:14 · 918 阅读 · 0 评论 -
ctfshow-web入门-命令执行(web41_exp与分析)
preg 是题目的正则匹配规则,在 ASCII 可见字符范围内,先排除掉正则表达式匹配的字符,将其他可用的字符进行按位或运算,再将运算得到的可见字符,以及参与或运算结果为可见字符的组合转为 16 进制拼接 % 后写入 txt 文件。过滤掉了数字、字母以及一些符号,之前接触过的无字母 rce 是取反编码再取反,采用不可见字符去绕过正则,但是这里取反符号被过滤掉了,但是注意到或符号被放出来了,下面附上这种类型题目的相关脚本,并给出一定解释。(2)php 可用字符生成脚本(这个的生成方式可以选择或和异或操作)原创 2024-06-08 17:41:26 · 667 阅读 · 2 评论 -
ctfshow-web入门-命令执行(web37-web40)
中间件的日志文件会保存网站的访问记录,比如HTTP请求行,User-Agent,Referer等客户端信息,如果在HTTP请求中插入恶意代码,那么恶意代码就会保存到日志文件中,访问日志文件的时候,日志文件中的恶意代码就会执行,从而造成任意代码执行甚至获取shell。将我们想要执行的代码包含进去,其实和 php://input 是一样的,让用户可以控制输入流,当它与文件包含函数结合时,用户输入的 data:// 流就会被当作 php 文件执行。就会显示容器有问题了。我们也可以采用编码绕过,对原创 2024-06-07 17:25:56 · 1674 阅读 · 0 评论 -
ctfshow-web入门-命令执行(web30-web36)
命令执行,需要严格的过滤。原创 2024-06-06 15:57:16 · 959 阅读 · 1 评论 -
ctfshow-web入门-命令执行(web29)五种解法绕过文件名检测
它的 payload 里用到了两个连续的单引号,在一些系统中,连续的两个单引号会被解释为一个单引号,而不会被视为字符串的结尾,从而使得字符串拼接在一起。因此,"fl''ag.php" 被解释为 "flag.php",从而绕过对文件名的检测。第一题代码很简单,就是对 preg_match 绕过,只要提交的参数值不出现 flag 就行。这条命令的作用是输出指定文件的内容,并在每一行前面加上行号。可以看到 flag 就在当前目录下,叫 flag.php。写入成功,这里还是测了一会儿才弄好,注意对单引号的转义。原创 2024-06-06 11:44:03 · 455 阅读 · 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 · 2359 阅读 · 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 · 1207 阅读 · 1 评论 -
关于PhpStorm的安装与汉化
解压后在scripts目录下找到uninstall-all-user.vbs,双击打开,点击确定会看到done。根据以往经验,一般这种都需要配置环境变量,因此将添加bin到path也勾上。查看一下环境变量,可以看到php的环境变量被自动添加了。因为我是第一次使用这个软件,因此选择第二个,点击OK。可以免费使用30天,也可以购买,下面我们介绍如何激活。如果刚才没有勾选添加,则需要手动添加bin路径进去。至此,phpstorm已经成功激活。这里php自动添加到的是用户变量。下载好后,双击exe安装程序。原创 2024-01-10 13:08:08 · 1113 阅读 · 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 · 693 阅读 · 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 · 2848 阅读 · 7 评论 -
CTF之PHP特性与绕过
A.A被传到URL中是A.A,但是到了php里面则会被转换为A_A,即保证了参数的传递,也避免了被strpos函数查找到;并且,在PHP8之前,如果参数中出现中括号[,那么中括号会被转换成下划线_,但是会出现转换错误,导致如果参数名后面还存在非法字符,则不会继续转换成下划线。在给参数传值时,如果参数名中存在非法字符,比空格和点,则参数名中的点和空格等非法字符都会被替换成下划线。isset()函数用于检查变量是否设置,如果设置了,则 id=$_GET['id'],否则 id=1。原创 2023-11-01 14:54:31 · 1337 阅读 · 0 评论 -
NewStarCTF2023week4-More Fast(GC回收)
当一个类创建之后它会自己消失,而 __destruct() 魔术方法的触发条件就是一个类被销毁时触发,而throw那个函数就是回收了自动销毁的类,导致destruct检测不到有东西销毁,从而也就导致无法触发destruct函数。当然这里保险一点的做法是先执行 ls 命令,然后再使用 ../../../ 进行目录穿越 ,找到flag所在目录,再进行 cat,并且这里过滤了关键字 flag,因此我们使用通配符 * 进行匹配。打开链接,存在很多个类,很明显是php反序列化漏洞利用,需要构造pop链 ,原创 2023-10-24 18:44:46 · 1220 阅读 · 5 评论 -
NewStarCTF2023week4-逃(反序列化字符串逃逸)
在反序列化的时候php会根据s所指定的字符长度去读取后边的字符,由于在序列化操作后又使用了str_replace()函数进行字符串替换,这就可能会改变字符串的长度,比如上面将bad替换为good,每替换掉一个bad,字符串长度明显就增加了1,而由于序列化之后s的值没变,但是进行了内容替换,改变了字符串长度,那么反序列化读取时,就并不能将原本的内容读取完全。得到:O:7:"GetFlag":2:{s:3:"key";而后面没有被读到的内容,也就是逃逸出来的字符串,就会被当做当前类的属性被继续执行。原创 2023-10-24 00:44:37 · 834 阅读 · 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 · 960 阅读 · 6 评论 -
NewStarCTF2023week2-Unserialize?
创建了一个 evil 对象并设置了 cmd 属性,然后对对象进行了序列化。但要注意,在 PHP 中,如果一个类包含私有属性,并且你尝试序列化该对象,私有属性的值将不会被包括在序列化结果中。因此,在反序列化时,你无法访问 cmd 属性的值,因为它不会被正确反序列化。定义了一个eval类,该类下有一个私有变量cmd和公有成员函数destruct(),该函数在对象的所有引用都被删除或类被销毁时会自动调用;如果满足if条件,没有被匹配到,则会调用system函数,执行我们传入的cmd内容;在根目录下找到flag。原创 2023-10-15 00:08:04 · 6474 阅读 · 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 · 755 阅读 · 1 评论 -
ctfshow萌新计划web9-14(正则匹配绕过)
可以使用通配符 * 或者 ? 进行模糊查询构造payload:?c=(~%8C%86%8C%8B%9A%92)('tac c*');或者:?c=(~%8C%86%8C%8B%9A%92)('tac ???fi??p??');即对我们想要执行的代码进行取反,url编码,再取反题目源代码里也有提示,flag在config.php里面原创 2023-10-12 18:40:08 · 508 阅读 · 0 评论 -
NSSCTF[SWPUCTF 2021 新生赛]hardrce(无字母RCE)
URL编码取反绕过正则实现RCE在取反之前PHP解释器并不知道是要执行一个函数,取反之后就算是一个函数也不会被当作代码执行。注意:在使用取反编码再取反进行绕过时,想要执行我们指定的代码,传入的payload必须要满足。原创 2023-10-11 15:06:32 · 1733 阅读 · 1 评论 -
php无字母数字rce绕过基础操作
在php中,反引号可以直接命令执行系统命令,反引号的作用是命令替换,将其中的字符串当成shell命令执行,返回命令的执行结果。反引号包括的字符串必须是能执行的shell命令,如果不是则会出错。当关键字 "php" 被过滤了之后,此时我们便不能使用了,但是我们可以用另外两种短标签进行绕过,并且在短标签中的代码不需要使用分号(;> 是为了闭合前面的php语句,后面则为执行命令的语句。url中的+表示空格,而要表示+号必须得用%2B,即URL编码。星号”*”指代任意字符数,问号“?原创 2023-10-10 23:41:53 · 636 阅读 · 0 评论 -
ctfshow-web12(glob绕过)
后面除了使用highlight_file()函数,也可以使用show_source()函数,后者就是前者的别名。print_r() 可以打印出复杂类型变量的值(如数组,对象) ,打印关于变量的易于理解的信息。glob("*") 会匹配任意文件,glob("*.php")则是匹配以php为后缀的文件。函数:返回一个包含匹配指定模式的文件名或目录的数组,如果失败则返回 FALSE。发现内容是一个数组,属于复杂类型变量,换用 print_r() 函数。原创 2023-10-10 14:23:46 · 723 阅读 · 1 评论 -
ctfshow-web11(session绕过)
当在代码中设置了session时,在http请求的消息头中会携带一个名为PHPSESSID的cookie,其值是一个32位16进制的字符串。服务端接收到这个cookie,根据其值在服务器中找到对应的session文件,从而实现保持与客户端链接状态的信息,其中session中存储着序列化的session键值等信息。strlen() 函数用来返回字符串的长度,如果提交的password和经过正则匹配替换后的字符串长度不相等,就会输出 sql inject error,die函数来终止脚本并显示错误消息。原创 2023-10-09 23:14:39 · 742 阅读 · 0 评论 -
ctfshow-web5(md5弱比较)
QLTHNDT 和 240610708经过md5加密后密文都以0e开头,PHP会当作科学计数法来处理,也就是0的n次方,得到的值比较的时候都相同。=== 是强等于:在比较前会先判断两种字符串类型是否相同,再进行比较,即先比较类型再比较值,需要都相等才会返回true。is_numeric()函数:检测字符串是否只由数字组成,如果字符串中只包括数字,就返回Ture,否则返回False。== 是弱等于:在比较前会先把两种字符串类型转成相同的再进行比较,它不会比较变量类型,只比较值。原创 2023-10-08 13:49:31 · 781 阅读 · 0 评论 -
ctfshow-web3(伪协议php://input的利用)
这是一个只读信息流,当请求方式是post的,并且enctype不等于”multipart/form-data”时,可以使用php://input来获取原始请求的数据,当enctype等于”multipart/form-data”时php://input是无效的。利用该方法,我们可以直接写入php文件,输入file=php://input,然后使用burp抓包,写入php代码。,php执行时会将post内容当作文件内容,从而导致。存在文件包含时直接使用PHP伪协议。,当传入的参数作为文件名打开时,可以。原创 2023-10-07 14:11:39 · 1313 阅读 · 0 评论 -
PHP特性之CTF中常见的PHP绕过
一、关于md5()和sha1()的常见绕过1、使用数组绕过2、 使用特殊字符串绕过二、strcmp绕过三、switch绕过四、intval绕过原创 2023-07-18 14:32:22 · 5989 阅读 · 1 评论 -
[NISACTF 2022]babyserialize(pop链构造与脚本编写详细教学)
一、理清pop链并进行标注二、如何编写相关脚本三、过滤与绕过1、waf的绕过2、preg_match的绕过原创 2023-07-06 00:44:48 · 1577 阅读 · 15 评论 -
[SWPUCTF 2021 新生赛] ez_unserialize
链尾(就是最终我们想要利用的地方),在echo $flag 并且include了flag.php往上看,发现只需要满足 再往上看,发现执行这条语句我们需要触发__destruct()函数__destruct是析构函数,会在对象的所有引用被删除或者当对象被显式销毁时自动执行,比如new完一个对象,当创建完成之后就不引用了,如果有赋值指向就会立马丢弃,触发destruct函数。这里还有一个__construct()构造函数,它是在实例化一个对象(即new时)会自动调用。原创 2023-07-05 16:59:47 · 1884 阅读 · 3 评论