
web
文章平均质量分 80
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 评论 -
渗透测试-利用mitmdump联动BurpSuite处理JS加解密示例
mitmproxy 中的 miti 其实就是中间人攻击,在保障服务端与客户端正常通信前提下,通过指定自定义的 python 脚本,实现任意化定制自动发包测试。上面只是以一个简单的 base64 加密为例,实际上这种方法在 js 逆向加解密测试中非常重要,因为现在很多网站数据传输都存在加密,不可能手动一次次去解,就可以考虑 mitmdump 与 BurpSuite 的联动,相当于网站完全没有加密了。原创 2025-01-22 11:15:44 · 885 阅读 · 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 评论 -
NewStarCTF2024-Week5-Web&Misc-WP
通过把 time 赋值为 happy 对象,将对象当做字符串就会触发 __tostring 魔术方法,转而继续执行 get_flag 函数,进入一个循环。但是文件传上去了怎么执行呢,文件是不会自己执行的,而且是 python 写的网站,我们 php 传上去也根本解析不了。这一步也是折腾了很久,一开始试了 /bin/ls,/usr/bin/ls,发现都会让环境崩掉。这里有个注释符,一开始想的是闭合再插入新的 php 语句,试了下没成功,采用换行符绕过。原创 2024-11-06 11:03:19 · 1532 阅读 · 0 评论 -
NewStarCTF2024-Week4-Web-WP
打算去改上周的脚本,结果去跑的时候忘了将上次的最后 payload 注释,直接就上周的脚本就跑出来 flag 了,week3 应该是打算考布尔盲注,week4 是时间盲注,所以直接就都打通了。最后 final.php 是一个反序列化的利用,一开始还想绕过过滤的 chocolate,后面发现不需要绕过,并且 url 编码后传入不行,直接传序列化后的内容。又看到另一个下载插件路径可控的,但是插件管理里面并没有看到可以下载插件的地方, 手动构造一下,但是似乎出不了网...原创 2024-10-30 13:32:37 · 1647 阅读 · 3 评论 -
NewStarCTF2024-Week3-Web-WP
使用 data 协议,结合 base64 编码绕过。这道题当时写的 exp 能打通 week3 和 week4 的,所以下周再给大家放出来。审代码的时候发现这句,说明应该是还有一个叫 flag.py 的文件原创 2024-10-23 09:25:03 · 1127 阅读 · 0 评论 -
ctfshow-web入门-反序列化(web254-web258)
通过反射调用私有变量。这里 code 和 class 都成了公有变量,我们可以直接访问到,只是增加了正则过滤,匹配的是大小写 o 或者 c:数字: 这种形式的内容,我们在数字前添加 + 绕过。原创 2024-10-18 16:56:03 · 1436 阅读 · 0 评论 -
NewStarCTF2024-Week2-Web-WP
在 PHP8 之前,如果参数中出现中括号[,那么中括号会被转换成下划线_,但是会出现转换错误,导致如果参数名后面还存在非法字符,则不会继续转换成下划线。也就是说,我们可以刻意拼接中括号制造这种错误,来保留后面的非法字符不被替换,因为中括号导致只会替换一次。顺便说下这里回溯绕过和数组绕过都是不行的,回溯一般用于匹配不到的情况,这里是要求匹配成功,其次我传了下服务器直接处理不了,数组的话也是一般用于匹配不到,因为 preg_match 处理不了数组会直接返回 false,显然这里需要的是返回 true。原创 2024-10-16 20:19:06 · 1511 阅读 · 0 评论 -
NewStarCTF2024-week1-所有WP(勇师傅版)
第一周的题比较简单所以 ak 了,勇师傅也就新生赛能体会下全栈的感觉,实则菜鸡一枚哈哈哈,要学的东西还多,慢慢来吧,路漫漫其修远兮,吾将上下而求索。原创 2024-10-08 21:13:55 · 4253 阅读 · 4 评论 -
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 评论 -
BaseCTF-Web-Week2-WP
但是$s2->word = $s1; 中 word 是私有变量,这里是调用不到的,链子顺序没有问题,修改代码访问私有变量。方法(1)通过使用 PHP 的反射机制访问和修改类的私有属性。原本是有一个工具 hashpump,但是我 git 的时候提示找不到仓库了,然后在 github 上找到了一个写好的 python脚本,叫做 hash-ext-attack:原创 2024-08-28 17:35:32 · 1606 阅读 · 0 评论 -
BaseCTF-web-Week1
在 URL 中,@ 符号前面的部分通常表示用户信息(例如用户名和密码),这种用法曾经用于需要在 URL 中嵌入用户名和密码的情况,但是由于安全原因,这种方式已逐渐被淘汰,现代浏览器大多不再支持直接从 URL 中提取用户名和密码进行身份验证。原创 2024-08-25 13:18:51 · 1412 阅读 · 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 评论