
ctfshow
文章平均质量分 85
My6n
我们会毁灭于我们所热爱的东西
展开
-
ctfshow-web入门-特定函数绕过(web396-web405)
host 为有效 IP ,scheme需要包含 ~或者.或者php,path以/开头并且只包括字母数字。使用正则验证 host 是否为有效的 ip 地址,我们前面一直传的 127.0.0.1 肯定是有效的。其实它根本都有没过滤到我们,就用分号也是可以的。环境没有开启成功,后面能开了再看。原创 2025-03-28 19:30:43 · 490 阅读 · 0 评论 -
ctfshow-web入门-黑盒测试(web380-web385)
发现参数直接传给了 file_get_contents 函数,存在文件包含漏洞,后面自动拼接了 .php。是 md5 加密后的,sqlmap自动帮我们爆破到了其中两个,另一个可以通过 cmd5 碰撞到。我们这里并不是想拿 flag,而是想拿 admin 的密码,因此我们跑 users 表的字段。重新跑数据库,将数据库跑完,发现还有一个叫 ctfshow 的数据库。原创 2025-03-28 14:10:28 · 1096 阅读 · 0 评论 -
ctfshow-re2 详解
将 Str 中的每个字符与 0x1F 异或,结果存储在 Str1 中,之后将 Str1 与字符串 "DH~mqqvqxB^||zll@Jq~jkwpmvez{" 进行比较,如果两个字符串相同则返回充值成功。那么这里处理的数据其实就是文件流 Stream 中的字节数据,即我们的文件 enflag.txt。定位关键函数 sub_401069 ,应该是对输入密钥 Str 进行了处理。继续跟进 sub_401A70 函数,就来到了加密逻辑的地方。判断为 RC4 算法,核心函数是 sub_4015E0。原创 2024-12-04 10:52:02 · 645 阅读 · 0 评论 -
ctfshow-web入门-SSRF(web351-web360)
通过 filter_var() 验证得到的 IP 地址是否为有效的公共 IP 地址,并且不是私有或保留地址。使用 gethostbyname() 将 URL 中的域名解析为对应的 IP 地址。使用 file_get_contents() 获取并输出该 URL 对应的内容。限制只能使用 http 或者 https 协议,并且禁止本地地址访问。匹配以 http://ctf. 开头,并且以 show 结尾。看到 curl_exec 函数,很典型的 SSRF。这次检测的是 127.0. 开头的。原创 2024-11-16 17:43:15 · 1243 阅读 · 0 评论 -
ctfshow-web入门-JWT(web345-web350)
F12 看到提示但是访问 admin 会重定向到 index.php提取 jwt 解码没有签名部分,只有 jwt 的前两部分 header 和 payloaduser 改成 admin,它这里没有声明加密算法,我们随便指定一个常见的 HS256。原创 2024-11-15 16:30:51 · 1044 阅读 · 0 评论 -
ctfshow-web入门-SSTI(web369-web372)下
当然,我们也可以按照上一题 {%print((lipsum|attr(gl)|string|list).pop(431))%} 的方法定位斜杠的位置,继续做拼接,按理来说是可行的,各位自行尝试,我只是觉得那样做复杂了。重新找一遍太折腾了,我们这里换 payload,不再构造数字了,直接用全角数字替换半角数字。看了其他wp发现这道题有更简单的方法,大家自行摸索,我这里还是做复杂了。因此我们前面构造的字符就会有区别,需要重新定位字符的位置。上一题演示的是外带,这里我们尝试反弹 shell。原创 2024-11-15 11:59:23 · 875 阅读 · 0 评论 -
ctfshow-web入门-SSTI(web361-web368)上
这个 payload 是一次性的,因为 pop 会删除里面的键,导致环境崩溃。对于这种没有过滤的,还有其他很多很多方法,这里就不列举了。前面的 payload 太长了,构造起来比较麻烦和乱。更保险的是使用 __getitem__ ,方法同上。(1)使用子类可以直接调用的函数来打。模糊测试看一下,过滤了 2 和 3。双大括号中过滤了 request。测试一下存在 SSTI 注入。并且 post 传参不允许。那就传给 cookie 吧。但是 {% %} 中可用。一起传给 cookie。原创 2024-11-13 17:21:26 · 811 阅读 · 0 评论 -
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入门-sql注入(web249-web253)nosql 注入
使用 Memcache 类的 get 方法从缓存中获取数据,$id 是传入的键,用于从缓存中获取与该键对应的值,结果存储在 $user 变量中。直接查 flag,遇到报错:采用数组绕过。这里从 ctfshow{ 后面开始注,将前面的 8 个字符确定后再继续猜后面的字符,即可拿到正确的 flag,原创 2024-09-13 00:18:47 · 1173 阅读 · 0 评论 -
ctfshow-web入门-sql注入-web248-UDF 注入
但其实 Http 的 get 方法提交的数据大小长度并没有限制,http 协议规范并没有对 url 长度进行限制,所谓的 get 长度有限制,是特定的浏览器及服务器对它的限制,不同浏览器和服务器的最大处理能力也是不同的。但是有一个问题,这里是 get 传参,而 URL 的长度是受限制的(URL 的最大长度是 2048 个字符),显然这里远远超了,若长度超限,服务端会返回 414。使用 concat 来将这三部分拼接后导入前面得到的路径:\/usr\/lib\/mariadb\/plugin\/原创 2024-09-11 21:28:44 · 1437 阅读 · 0 评论 -
ctfshow-web入门-sql注入(web244-web247)error 报错注入
这里的回显要么是查询成功,要么是查询失败,因此无法使用联合查询注入,很典型的布尔盲注特征,注意这里用于闭合的注释符需要使用 url 编码的形式:题目是想考报错注入,这里我先介绍盲注。同样得到表名ctfshow_flag,再使用extractvalue 函数查列名:原创 2024-09-11 12:28:43 · 1349 阅读 · 0 评论 -
ctfshow-web入门-sql注入(web241、web242、web243)delete & file 注入
如果采用布尔盲注,我们需要根据页面的回显情况来判断,但是数据只有 21 条,并不够我们删除,还没查出结果数据就会被删完,因此采取时间盲注,通过延时来判断。真的是很无语,题目就给个 dump 目录,又不说我这个 filename 在哪里传,找了 api 接口,不是,file.php?,也不是,我****一个会将写入内容放在开头,另一个则是设置在结尾,为了减少配置文件内容被查询内容影响,这里我们选择将配置文件内容放在开头。等于 0 的 id 没有,因此前面不成立,不会执行删除操作,而是执行后面语句。原创 2024-09-10 15:13:03 · 1046 阅读 · 0 评论 -
ctfshow-web入门-sql注入(web237-web240)insert 注入
我们需要闭合单引号和括号实际插入的内容成了 1 和 database()可以看到数据库名为 ctfshow_web这里其实我在纠结 # 将后面内容都注释掉了,虽然单引号和括号都正确闭合了,但是 insert 前面单独的双引号不会报错吗?注意,在这个语句中,insert 前面的双引号其实是 PHP 代码中的字符串起始符,SQL 引擎是不会看到这个双引号的,数据库只会看到去掉了 PHP 引号后的 SQL 语句。所以在 PHP 代码中,这样的双引号不会导致 SQL 错误。原创 2024-09-07 15:08:40 · 1372 阅读 · 0 评论 -
ctfshow-web入门-sql注入(web231-web236)update 注入
使用 mysql.innodb_table_stats 和 mysql.innodb_index_stats 代替,它们是 MySQL 内部的系统表,用于存储 InnoDB 引擎相关的统计信息,内容与 information_schema.tables 类似,也可以用来获取数据库中的库名和表名,这两个表都包含了 database_name 和 table_name 字段。数据库名还是 ctfshow_web,后面的密码是我们输入的 111 经过 md5 加密后的内容。原创 2024-08-24 11:49:12 · 1211 阅读 · 0 评论 -
ctfshow-web入门-sql注入(web224-web230)文件类型注入、routines存储过程与函数状态、handler语句、预处理prepare+execute
也就是将表名 ctfshow_user 改为了 ctfshow_flagasa,将字段名 username 改为 flag,之后我们就可以使用万能密码 1' or 1=1# 查出 flag。PREPARE 语句准备好一条 SQL 语句,并分配给这条 SQL 语句一个名字供之后调用,通过EXECUTE 命令执行,最后使用 DEALLOCATE PREPARE 命令释放。原创 2024-08-19 18:54:44 · 1465 阅读 · 0 评论 -
ctfshow-web入门-sql注入(web221、web222、web223)limit 注入与 group 注入
这里是 get 传参并且进行了 URL 解码,如果拼接方式是加号会导致服务器错误的解析为空格,从而无法识别,没有回显,需要对加号进行 URL 编码再传入,即%2b 。接下来就可以开始写脚本了,在上一题的基础上改。这里用的还是原始方法 substr,当然也可以用 like 通配,或者用 regexp 正则匹配,原理一样,我就不再过多测试了。原创 2024-08-17 02:11:14 · 1125 阅读 · 0 评论 -
ctfshow-web入门-sql注入(web216-web220)时间盲注结束
跑出结果一样,那就说明是那个判断时间的问题,因为一开始在 hackbar 测试,那个 payload 大概是 3s,结果后面变成了只有 1s 左右,因此 1s 和 0.5s 都可能会导致结果不准确,这里主要还是设置好一个判定时间,改成 0.8s 就比较准确了,具体多少取决于你实际题目环境。前面的脚本是用 if 语句进行判断,这里写一下 try 语句,不用获取响应消耗的时间,而是我们手动设置一个请求超时的时间,因为前面的延时大概是 3s ,这里超时时间设小一点,为 1.5s。原创 2024-08-14 22:49:57 · 1698 阅读 · 0 评论 -
ctfshow-web入门-sql注入(web211-web215)系统练习sqlmap的使用+开始时间盲注
对于 mysql 数据库,sqlmap 的 --os-shell 参数就是写入两个 php 文件,其中一个是提供文件上传功能的文件,之后再上传一个是用于进行命令执行的文件,也就是最后反弹给我们的 shell。当然,对于 --os-shell 能利用也是有一定条件的,一般需要是高权限数据库用户,并且需要知道网站的绝对路径,具有写入文件的权限,还有一些其他条件。于是又再跑了一次,这回正常了,可能是猜到 6 的时候请求响应还是耗时超过了 2s,以至于没有去判断字典后面的 h 而造成的误判。原创 2024-08-12 03:16:13 · 1511 阅读 · 0 评论 -
ctfshow-web入门-sql注入(web206-web210)系统练习sqlmap之tamper的使用与编写
我们对查询的 payload 进行逆向处理,先反转,再 base64 加密,再反转,再 base64 加密,传入查询后,经过题目的解密和反转处理,最终又恢复到我们正确的 payload 实现注入。查询语句里新增了括号,我们注入也需要将其闭合掉,就像我们闭合单引号那样,对于 sqlmap 它会自动对闭合点进行测试的,常见的就是单引号、双引号、单引号加括号或者双引号加括号。拿下,flag:ctfshow{549d46ab-3974-43a6-ac07-cbcc41357083}原创 2024-08-11 01:06:06 · 1322 阅读 · 0 评论 -
ctfshow-web入门-sql注入(web201-web205)系统练习sqlmap的使用
开始系统练习sqlmap的使用。发现在访问 index.php 前都会先访问 getToken.php追加 --safe-url 参数设置在测试目标地址前访问的安全链接,将 url 设置为 api/getToken.php,再加上 --safe-preq=1 表示访问 api/getToken.php 一次:原创 2024-08-09 06:47:19 · 1751 阅读 · 0 评论 -
ctfshow-web入门-sql注入(web196-web200)堆叠注入
这里把 create 和 drop 都过滤了,那么我们直接用 insert 插入来覆盖 pass 和 username 的值。其中 $row[0] 表示从数据库查询结果中提取的某一行的第一个字段值,我们可以使用 select 来设置$row[0] 的值,再提交我们设置的 password 满足两者相等,payload:还是堆叠注入,显示过滤了 select 实际并没有。原创 2024-08-08 23:29:55 · 651 阅读 · 0 评论 -
ctfshow-web入门-sql注入(web191-web195)
我们不指定第三个参数,就可以实现和 left 和 right 一样的效果。密码只能是数字,过滤了空格,采用反引号包裹绕过,题目已经说了是堆叠注入,这里直接修改用户名和密码:原创 2024-08-07 23:50:44 · 1222 阅读 · 0 评论 -
ctfshow-web入门-sql注入(web186-web190)
在上一题中我们提到了,使用 true+true 的方法构造出数字比如 true+true+true 就可以构造出 3,再使用 char 函数将数字转为对应的 ASCII 字符,最终实现我们 payload 的转换。在 SQL 中,数字和字符串的比较是弱类型的,如果在比较操作中涉及到字符串和数字,SQL 会尝试将字符串转换为数字,那么只要字符串不是以数字开头,比较时都会转为数字 0。拿到 flag:ctfshow{e54220e0-e81f-4e0e-ad32-0bbbbdd43d83}原创 2024-08-06 04:26:07 · 1531 阅读 · 0 评论 -
ctfshow-web入门-爆破(web21-web24)
(intval(substr($token, 1,1))+intval(substr($token, 14,1))+substr($token, 17,1))/substr($token, 1,1) === intval(substr($token, 31,1)) 将第 2、15 和 18 个字符转换为整数相加,再除以第 2 个字符的整数值,检查结果是否等于第 32 个字符的整数值;flag.ctf.show 页面无法访问(前面有一个查这个域名的 DNS 的 TXT信息的题也是有问题)原创 2024-06-02 17:29:44 · 2062 阅读 · 0 评论 -
ctfshow-web入门-sql注入(web181-web185)
过滤字符:(1)空白字符:空格 ( )、水平制表符 (\x09)、换行符 (\x0a)、垂直制表符 (\x0b)、换页符 (\x0c)、空字符 (\x00)、回车符 (\x0d)、不换行空格 (\xa0)(2)符号:星号 (*)、井号 (#)(3)关键词(不区分大小写):file、into、select1'--%0c1'||1--%0c拿到 flag:ctfshow{bef90a74-9ae2-4c76-8111-0ea0406f120b}原创 2024-08-04 15:26:20 · 1457 阅读 · 0 评论 -
ctfshow-web入门-sql注入(web176-web180)
闭合后简单判断了下字段数是 3测试联合查询注入,存在关键字的过滤,包括 select 和 union(后面经过测试实际只过滤了 select)回显成功得到表名为 ctfshow_user题目中要求 username!='flag'拿到 flag:ctfshow{4dacb0f6-4795-43f4-8b76-d300234e40b6}原创 2024-08-03 19:41:25 · 967 阅读 · 0 评论 -
ctfshow-web入门-sql注入(web171-web175)
这里只出了一个 id,因为换行导致我们误判为到了最后一个字符,因为我们的字典里只包括数字、小写字母和下划线,因此字符没找到,便跳出外层循环结束了代码。判断一下这次又是三个字段数了,因为还是对输出过滤了 flag,所有我们还是不查用户名,用占位符占位即可。接下来我们先判断下它数据库名的长度,这个其实可以通过 burpsuite 的攻击模块爆破的,没关系,我们这里手写一遍,也锻炼下我们 python 的能力。原创 2024-07-31 22:57:22 · 1996 阅读 · 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 评论