ctfshow
文章平均质量分 86
Myon⁶
攻防这条路很长,未来如星辰大海般璀璨,不必踟躇于过去的半亩方塘,道阻且长,行则将至。
展开
-
ctfshow-web入门-sql注入(web249-web253)nosql 注入
使用 Memcache 类的 get 方法从缓存中获取数据,$id 是传入的键,用于从缓存中获取与该键对应的值,结果存储在 $user 变量中。直接查 flag,遇到报错:采用数组绕过。这里从 ctfshow{ 后面开始注,将前面的 8 个字符确定后再继续猜后面的字符,即可拿到正确的 flag,原创 2024-09-13 00:18:47 · 886 阅读 · 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 · 1059 阅读 · 0 评论 -
ctfshow-web入门-sql注入(web244-web247)error 报错注入
这里的回显要么是查询成功,要么是查询失败,因此无法使用联合查询注入,很典型的布尔盲注特征,注意这里用于闭合的注释符需要使用 url 编码的形式:题目是想考报错注入,这里我先介绍盲注。同样得到表名ctfshow_flag,再使用extractvalue 函数查列名:原创 2024-09-11 12:28:43 · 1150 阅读 · 0 评论 -
ctfshow-web入门-sql注入(web241、web242、web243)delete & file 注入
如果采用布尔盲注,我们需要根据页面的回显情况来判断,但是数据只有 21 条,并不够我们删除,还没查出结果数据就会被删完,因此采取时间盲注,通过延时来判断。真的是很无语,题目就给个 dump 目录,又不说我这个 filename 在哪里传,找了 api 接口,不是,file.php?,也不是,我****一个会将写入内容放在开头,另一个则是设置在结尾,为了减少配置文件内容被查询内容影响,这里我们选择将配置文件内容放在开头。等于 0 的 id 没有,因此前面不成立,不会执行删除操作,而是执行后面语句。原创 2024-09-10 15:13:03 · 875 阅读 · 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 · 1201 阅读 · 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 · 936 阅读 · 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 · 1155 阅读 · 0 评论 -
ctfshow-web入门-sql注入(web221、web222、web223)limit 注入与 group 注入
这里是 get 传参并且进行了 URL 解码,如果拼接方式是加号会导致服务器错误的解析为空格,从而无法识别,没有回显,需要对加号进行 URL 编码再传入,即%2b 。接下来就可以开始写脚本了,在上一题的基础上改。这里用的还是原始方法 substr,当然也可以用 like 通配,或者用 regexp 正则匹配,原理一样,我就不再过多测试了。原创 2024-08-17 02:11:14 · 922 阅读 · 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 · 1287 阅读 · 0 评论 -
ctfshow-web入门-sql注入(web211-web215)系统练习sqlmap的使用+开始时间盲注
对于 mysql 数据库,sqlmap 的 --os-shell 参数就是写入两个 php 文件,其中一个是提供文件上传功能的文件,之后再上传一个是用于进行命令执行的文件,也就是最后反弹给我们的 shell。当然,对于 --os-shell 能利用也是有一定条件的,一般需要是高权限数据库用户,并且需要知道网站的绝对路径,具有写入文件的权限,还有一些其他条件。于是又再跑了一次,这回正常了,可能是猜到 6 的时候请求响应还是耗时超过了 2s,以至于没有去判断字典后面的 h 而造成的误判。原创 2024-08-12 03:16:13 · 1136 阅读 · 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 · 1020 阅读 · 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 · 1374 阅读 · 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 · 482 阅读 · 0 评论 -
ctfshow-web入门-sql注入(web191-web195)
我们不指定第三个参数,就可以实现和 left 和 right 一样的效果。密码只能是数字,过滤了空格,采用反引号包裹绕过,题目已经说了是堆叠注入,这里直接修改用户名和密码:原创 2024-08-07 23:50:44 · 998 阅读 · 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 · 1193 阅读 · 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 · 962 阅读 · 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 · 898 阅读 · 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 · 686 阅读 · 0 评论 -
ctfshow-web入门-sql注入(web171-web175)
这里只出了一个 id,因为换行导致我们误判为到了最后一个字符,因为我们的字典里只包括数字、小写字母和下划线,因此字符没找到,便跳出外层循环结束了代码。判断一下这次又是三个字段数了,因为还是对输出过滤了 flag,所有我们还是不查用户名,用占位符占位即可。接下来我们先判断下它数据库名的长度,这个其实可以通过 burpsuite 的攻击模块爆破的,没关系,我们这里手写一遍,也锻炼下我们 python 的能力。原创 2024-07-31 22:57:22 · 1254 阅读 · 0 评论 -
ctfshow-web入门-php特性(web147-web150_plus)
:匹配字符串的开头。$:匹配字符串的结尾,确保整个字符串符合规则。[a-z0-9_]:表示允许小写字母、数字和下划线。*:匹配零个或多个前面的字符。/i:忽略大小写。s:匹配包括换行符在内的所有字符。D(PCRE 特有):美元符号 $ 仅匹配字符串的实际末尾,不匹配结尾的换行符。这里只需要让 $ctfshow 里面有其他字符即可满足 if 判断。在 PHP 中,命名空间(namespace)提供了一种组织代码的方式,可以避免类、函数和常量名称的冲突。原创 2024-07-27 15:54:21 · 1449 阅读 · 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 · 928 阅读 · 0 评论 -
ctfshow-web入门-php特性(web137-web141)
查看源码:拿到 flag:ctfshow{dd387d95-6fbe-4703-8ec5-9c8f9baf2bb5}在 php 中,-> 用于访问类的实例成员(属性和方法),我们需要先实例化类,然后通过实例对象来调用其成员;而 :: 用于访问类的静态成员(静态属性和静态方法)和常量,静态成员属于类本身,而不是任何具体实例,因此不需要实例化类即可调用它们。原创 2024-07-26 20:35:55 · 1284 阅读 · 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 · 1454 阅读 · 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 · 749 阅读 · 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 · 1252 阅读 · 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 · 1131 阅读 · 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 · 856 阅读 · 0 评论 -
ctfshow-web入门-php特性(web100-web103)is_numeric 函数绕过
我们只需要构造输出 ctfshow 这个类即可。虽然逻辑运算符的优先级比赋值运算符要高,但是如果逻辑运算符和赋值运算符连用时,往往允许存在先进行赋值运算,后再进行逻辑运算的顺序。需要满足 if 语句才会进入后面的判断,因此要求 v0 为 1,这里用的是 and,所以只需要满足 v1是数字即可。要求 v2 中不能有分号,v3 中需要有分号。如果上述要求都满足,则会调用 eval 函数。代入 eval 函数实际就是执行:");原创 2024-07-13 17:10:44 · 1116 阅读 · 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 · 1127 阅读 · 0 评论 -
ctfshow-web入门-php特性(web89-web95)intval 函数绕过
如果第一次匹配成功,再次使用正则表达式匹配 $a 是否等于字符串“php”,但这次只有不区分大小写,是单行模式,不会匹配多行,如果第二次没有匹配成功就会输出 flag。也就是说,如果 num 中不包含数字 "0" 就会终止程序,但是还有一种情况,如果这个 0 出现在开头,虽然是找到了有 0 这个字符,但是返回位置为 0 ,if (!== 是相等运算符,在进行比较时,会先将字符串类型转化成相同,再比较,比如比较一个数字和字符串或者比较涉及到数字内容的字符串,字符串会被转换成数值并按照数值来进行比较。原创 2024-07-12 11:47:12 · 856 阅读 · 0 评论 -
ctfshow-web入门-文件上传(web166、web167)&(web168-web170)免杀绕过
查看源码,前端只让传 zip上传 zip 成功后可以进行下载随便搞一个压缩包,使用记事本编辑,在其内容里插入一句话木马:上传该压缩包,上传成功后点击下载文件,使用 burpsuite 抓包:我这里木马内容用的 request ,就在 get 里执行 ls 没什么问题,但是读取 flag 时识别有点问题,最好使用 post 请求,因此将请求方法改为 post ,将 file 的内容还原到上面。原创 2024-07-11 16:21:08 · 1085 阅读 · 0 评论 -
ctfshow-web入门-文件上传(web164、web165)图片二次渲染绕过
web164 和 web165 的利用点都是二次渲染,一个是 png,一个是 jpg二次渲染:网站服务器会对上传的图片进行二次处理,对文件内容进行替换更新,根据原有图片生成一个新的图片,这样就会改变文件原有的一些内容,我们需要将一句话木马插入到数据不会被改变的位置,确保一句话木马不会受到二次渲染的影响。原创 2024-07-09 15:43:00 · 1491 阅读 · 0 评论 -
ctfshow-web入门-文件上传(web161、web162、web163)远程包含
后面又去 b 站看了下视频,发现它远程包含的就是一个 php 文件,而我这里包含的 shell 是一个纯文本的东西,我最开始以为是将这段内容包含进了 index.php 的代码里,所以就没有考虑它不是 php 后缀是否可以正常解析的问题。后面问了群里的师傅,说用 flask,我原本用的是 Apache 搭的服务,重置了服务器,Apache 和 php 其实都是刚下的,可能还需要配置点什么吧,不清楚,因此我们将木马放到 flask 服务上去。那么我们上传的文件名就不使用后缀即可:这里以 test 为例。原创 2024-07-09 14:59:30 · 1491 阅读 · 0 评论 -
ctfshow-web入门-文件上传(web151-web160)
试了下前端只能传 png 后缀的将一句话木马改成 png 后缀,上传后用 burpsuite 抓包绕过前端检测后,改回 php 后缀,发包拿到 flag:ctfshow{e3bd0332-4d5f-4255-941f-a2e6095c4f17}我们还可以直接改它前端验证的代码:原本只支持上传 png 后缀的文件我们加一个 php 后缀进去,即可直接上传 php 后缀的文件。原创 2024-07-07 12:27:30 · 1309 阅读 · 3 评论 -
ctfshow-web入门-文件包含(web88、web116、web117)
没有过滤冒号 : ,可以使用 data 协议,但是过滤了括号和等号,因此需要编码绕过一下。这里有点问题,我 ('ls') 后加上分号发现不行,可能是编码结果有加号,题目做了过滤去掉分号得到 PD9waHAgc3lzdGVtKCdscycpPz4=,传入时要把等号去掉,因为题目过滤掉了等号,否则会触发 die 函数,即使去掉等号,base64 解码也是原创 2024-07-06 16:10:35 · 1078 阅读 · 0 评论 -
ctfshow-web入门-文件包含(web87)巧用 php://filter 流绕过死亡函数的三种方法
但是我们传入的一句话木马也是 XML 标签,如何让它只去除 而不破坏我们传入的木马呢?我们可以先对一句话木马进行 base64 编码后传入,这样就不会受到strip_tags 函数的影响,当去除掉 后,由于 php://filter 允许使用多个过滤器,我们再调用 base64-decode 将一句话木马进行 base64 解码,实现还原。原创 2024-07-06 12:41:50 · 1180 阅读 · 0 评论 -
ctfshow-web入门-文件包含(web82-web86)条件竞争实现session会话文件包含
file_get_contents 函数将会读取文件的全部内容并将其作为字符串返回,strpos($content, "原创 2024-07-05 16:48:58 · 1661 阅读 · 4 评论 -
ctfshow-web入门-文件包含(web78、web79、web80、web81)
中间件的日志文件会保存网站的访问记录,比如HTTP请求行,User-Agent,Referer等客户端信息,如果在HTTP请求中插入恶意代码,那么恶意代码就会保存到日志文件中,访问日志文件的时候,日志文件中的恶意代码就会执行,从而造成任意代码执行甚至获取shell。此外我们也可以使用 data:// 协议进行代码执行,其实和 php://input 是一样的,让用户可以控制输入流,当它与文件包含函数结合时,用户输入的 data:// 流就会被当作 php 文件执行。会将我们输入的 php 替换为问号?原创 2024-07-04 14:42:56 · 1617 阅读 · 0 评论 -
ctfshow-web入门-命令执行(web119、web120、web121、web122)
被解释成了 1,因此 ${HOME::$?这里出现了 3,放到前面的题去试了下,BASH 和 SHELL 的依旧是不行,难道都不是 /bin/bash吗,很奇怪。这里当前登录的用户名应该是 www-data,我最开构造的是 a ,取变量的最后一个字母,也就是 /bin/?原创 2024-07-03 17:18:15 · 1128 阅读 · 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 · 1159 阅读 · 0 评论