<
强网杯线上赛
>

没有上一篇咯
下一篇

谈js静态文件在漏洞挖掘中的利用

randomstudy

首先需要暴力破解skr的hex值

img

img

进入下一步验证队伍身份

img

challenge1

![4]

img

比较简单根据下载的题目py只要让其接受的时间和input的时间相等就可可以

1558932227455

challenge 2

1558932288569

分析脚本,可以知道此为我们要预测的第三个随机数

import java.util.Random;
public class Lol {  
public static int next(long paramLong) {
	byte b = 32; 
    long l = paramLong * 25214903917L + 11L & 0xFFFFFFFFFFFFL;
    return (int)(l >>> 48 - b);  }   
    public static void main(String[] paramArrayOfString) {
    System.out.println("Starting");
    long l1 = Long.parseLong(paramArrayOfString[0]);
    long l2 = Long.parseLong(paramArrayOfString[1]);
    long l3 = 0L; 
    for (byte b = 0; b < 65536; b++) {  
        l3 = l1 * 65536L + b;   
        if (next(l3) == l2) {    
            System.out.println("Seed found: " + l3);   
            break;      }   
    }    
     Random random = new Random((l3 ^ 0x5DEECE66DL) & 0xFFFFFFFFFFFFL);    		int i = random.nextInt();  
      int j = random.nextInt(); 
     System.out.println(j);
    }
}


可以使用这种方法预测下一个随机数

1558934453137

如上图,可以成功预测进入下一关。

ps:我们不知道服务器上的数据是否被绝对值,因此我们需要进行尝试多次。

challenge 3

这个可以使用python强大的randcrack库。接受624个随机数,然后对下一个进行预测

为什么是624,见https://github.com/tna0y/Python-random-module-cracker

1558934304840

最后就可以得到flag了

1558942943451

强网先锋-辅助

1558936330844

由题分析,这是一道RSA的解密,

已知c e n,类型

c1=pow(m,e1,n1)

c2=pow(m,e2,n2)

解法:

RSA选择密文攻击

利用公约数

如果两次加密的n1n2具有相同的素因子,可以利用欧几里德算法直接分解n1n2

通过欧几里德算法计算出两个n的最大公约数p

由题已知:给出了n1,n2

n1=14967030059975114950295399874185047053736587880127990542035765201425779342430662517765063258784685868107066789475747180244711352646469776732938544641583842313791872986357504462184924075227433498631423289187988351475666785190854210389587594975456064984611990461126684301086241532915267311675164190213474245311019623654865937851653532870965423474555348239858021551589650169602439423841160698793338115204238140085738680883313433574060243600028500600824624358473403059597593891412179399165813622512901263380299561019624741488779367019389775786547292065352885007224239581776975892385364446446185642939137287519945974807727

n2=14624662628725820618622370803948630854094687814338334827462870357582795291844925274690253604919535785934208081825425541536057550227048399837243392490762167733083030368221240764693694321150104306044125934201699430146970466657410999261630825931178731857267599750324918610790098952520113593130245010530961350592735239454337631927669542026935873535964487595433984902529960726655481696404006628917922241666148082741874033756970724357470539589848548704573091633917869387239324447730587545472564561496724882799495186768858324490838169123077051890332313671220385830444331578674338014080959653201802476516237464651809255679979

1558940640403

根据欧几里德算法算出的p之后,再用n除以p即可求出q

由此可以得到的参数有pqne,再使用常规方法计算出d,即可破解密文 。

具体如下:

通过欧几里得算法可以通过e与n的欧拉函数的值轻易求出d,从而计算出解密密钥。

即在知道e,p,q的情况下,可以解出d:

##自己写,或者gmpy2 invert
def egcd(a, b):
    if a == 0:
      return (b, 0, 1)
    else:
      g, y, x = egcd(b % a, a)
      return (g, x - (b // a) * y, y)
  def modinv(a, m):
    g, x, y = egcd(a, m)
    if g != 1:
      raise Exception('modular inverse does not exist')
    else:
      return x % m

modinv函数即为求模拟的函数,在知道e,p,q的情况下,可以:

d=modinv(e,(p-1)*(q-1))

至此知道了 p、q、n、e、d,常规求解得

1558940779305

1558941114089

强网先锋-上单

1558941258295

前段时间的tp5 5.x rce话不多说 getshell

1558941387193

根目录得到flag{a740ce62ab8c77a17faa65b518198fed}

Web1-Upload

0x01 前期测试

  1. 注册账号

  2. 登陆

  3. Cookie中的字段base64解码后是个序列化后的字符串。

  4. 上传文件,上传的文件被重命名,内容可以通过 GIF89a 绕过

  5. 使用dirsearch扫描目录,发现www.tar.gz。这个结果出来的比较晚,其实是根据第二道web题联想到的源码泄漏。

0x02 源码审计

  1. 审计一下源码。发现了反序列化漏洞

发现 Register.php,Profile.php文件中的魔术方法可以配合使用。

​ 先看Profile.php中 有两个魔术方法

__get()(获取不可访问或者不存在的属性时调用)和__call()(调用不存在的方法时调用)

​ 再看Register.php

__destruct对象销毁的时候会被调用

2.思路是这样的

​ 使用反序列化漏洞,可以实现设置类中的字段从而调用类。

Register.__destruct() --> Profile.index()--> Profile.__call() -->Profile.__get()-->Profile.upload_img()

2.1 Register.php的__destruct函数

img

​ 设置

$this->registed=0;

$this->checker=new Profile();

实现调用Profile.index()函数,index函数不存在然后调用Profile.__call()

2.2 Profile.php

img

Profile.__call()函数中 $name = index;

​ 其中逻辑是 判断 $this->index 的值,然后执行$this->{$this->{$name}}($arguments);

此处通过参数构造可以实现调用 profile.upload()函数中的敏感操作。

$this->index 不存在 所以调用 profile.__get()函数 可以这样理解:

$this->index = $this->except['index'];

​ 所以$this->except['index']=upload_img;

2.3 upload_img函数 判断了$this->ext的值,验证了$this->filename_tmp 文件内容,从而实现文件复制操作,复制上传的图片文件内容到新的文件中。

img

​ 构造参数如下:

$filename_tmp=./upload/xxxx(之前上传的图片文件,内容图片马);

$filename=./upload/she.php

$this->ext=1

0x03 poc构造

最终的poc 构造如下

img

0x04 实现过程

  1. 上传一个图片马(GIF89a 绕过getimagesize()函数)

img

  1. 记录上传文件路经,使用poc生成 user字段的值

图片的路径为:

/upload/da5703ef349c8b4ca65880a05514ff89/1facf1a313bc0f5cb31c311835417c00.png

生成的序列化字符串为:

O:27:"app\web\controller\Register":2:{s:7:"checker";O:26:"app\web\controller\Profile":4:{s:12:"filename_tmp";s:78:"./upload/da5703ef349c8b4ca65880a05514ff89/1facf1a313bc0f5cb31c311835417c00.png";s:8:"filename";s:16:"./upload/she.php";s:3:"ext";i:1;s:6:"except";a:1:{s:5:"index";s:10:"upload_img";}}s:8:"registed";i:0;}

将上面的序列化字符串。经过base64加密后就是user字段的值

  1. 抓个页面包修改user字段:

img

img

4 虽然报错了,但是不影响最终的结果,可见she.php生成

img

5 使用蚁剑连接,flag文件就在 / 目录下

img

img

Top
Foot