0x00 背景
近日,360网站卫士安全团队近期捕获一个基于PHP实现的webshell样本,其巧妙的代码动态生成方式,猥琐的自身页面伪装手法,让我们在分析这个样本的过程中感受到相当多的乐趣。接下来就让我们一同共赏这个奇葩的Webshell吧。
2024年08月11日
0x00 背景
近日,360网站卫士安全团队近期捕获一个基于PHP实现的webshell样本,其巧妙的代码动态生成方式,猥琐的自身页面伪装手法,让我们在分析这个样本的过程中感受到相当多的乐趣。接下来就让我们一同共赏这个奇葩的Webshell吧。
2024年08月11日
你可能喜欢的文章
1-1:Nginx+PHP+FastCGI加速模式
1-2:Nginx服务优化(隐藏版本号、修改用户和组、设置链接超时)
1-3:Nginx服务优化(日志切割与设置链接超时)
2-1:Nginx均衡TCP协议服务器案例
2024年08月11日
文章来源:台下言书
前言
每次出去做应急都能碰到各种各样的恶意软件、webshell,有的运气好能在网上遇到大神对该样本的分析文章,这样处理起来就会比较高效。运气不好网上找不到,只能自己去做分析了,比较耗时。而一个恶意软件,就拿碰到最多的挖矿系列来说,基本上都是有下载器、守护程序、释放的主程序、横向程序等多个文件,分布在系统的不同位置。还有就是webshell,找起来同样十分困难。
2024年08月11日
<?php
namespace app\api\service;
use app\api\traits\Singleton;
/**
* 分布式锁
* Class LockService
* @package app\api\service
*/
class LockService extends BaseService
{
private $lockValue;
//有效期,5秒钟
private $expireTime = 5;
//使用场景
private $scene;
//redis连接实例
private $redis;
public function __construct($scene = 'kill', $expireTime = 5)
{
$this->scene = $scene;
$this->expireTime = $expireTime;
$this->redis = RedisService::getInstance()->client();
}
//加锁
public function lock()
{
$this->lockValue = md5(uniqid());
$result = $this->redis->set($this->scene, $this->lockValue,
'EX', $this->expireTime,'NX');
if(empty($result)){
return false;
}
return true;
}
//释放锁
public function unlock()
{
$script = <<<LUA
local key=KEYS[1]
local value=ARGV[1]
if(redis.call('get', key) == value)
then
return redis.call('del', key)
end
LUA;
$this->redis->eval($script, 1, $this->scene, $this->lockValue);
}
}
/*
//调用执行
$lockService = new LockService('kill');
if($lockService->lock()){
//自行相关操作
//释放锁
$lockService->unlock();
}
else{
echo "请求频繁,请稍后再操作\n";
}
*/
2024年08月11日
我们经常可能会用到邀请码,邮件验证码,或者需要使用unique 字符串标记用户属性的情况。
今天我们且不说高深的“全局唯一ID”的生成方案,我们说一个简单的,如何生成一个唯一的,随机的,数组字母组成的字符串。
2024年08月11日
<?php
$appId = AppUtils::getAppId();
$appSecret = AppUtils::getAppSecret();
var_dump($appId,$appSecret);
2024年08月11日
什么是CSRF
CSRF可以叫做(跨站请求伪造),咱们可以这样子理解CSRF,攻击者可以利用你的身份你的名义去发送(请求)一段恶意的请求,从而导致可以利用你的账号(名义)去--购买商品、发邮件,恶意的去消耗账户资源,导致的一些列恶意行为.CSRF可以简单分为Get型和Post型两种。
2024年08月11日
后续还有优化,目前只有大体思路
public function miaosha(){
$uid=uniqid(); //模仿用户id 随机数代替
#redis 连接
$redis =new \Redis();
$redis->connect('127.0.0.1',6379);
try{
do{
$list =[];
$key='test_key';
$value =uniqid();
$numkey ='storeid'.'11111'; //商品的Key 用来存商品数量
$redis->watch($numkey); //监听商品数量
#一个用户只能购买一个
if($redis->hget('www',$uid)){
return ['msg'=>'不能重复'];
}
//加锁
$is_lock = $redis->set($key,$value,['nx','ex'=>'10']);
if($is_lock){
$arr[$key] =$value; //记录当前获取锁的用户
$stock = $redis->get($numkey);
if($stock<=0){//商品数量为0秒杀结束,删除锁
if($redis->get($key)==$arr[$key]){
$redis->del($key);
}
return ['msg'=>'结束'];
}
#开启事务
$redis->multi();
$redis->decr($numkey);
$redis->hSet('www',$uid,'11111');
$redis->lPush('list',$uid);
$redis->exec();
#提交事务解锁
if($redis->get($key)==$arr[$key]){
$redis->del($key);
}
break;
}else{
//没有获取锁睡眠重试
usleep(5000);
}
}while(!is_lock);
return $redis->lLen('list');
}catch (\Exception $e){
$redis->discard();//redis 回滚
return $e->getMessage();
}