Top命令参数相关系统知识总结

平均负载

平均负载是指单位时间内,系统处于可运行状态(R 状态 Running 或 Runnable)和不可中断状态(Uninterruptible Sleep,也称为 Disk Sleep) 的平均进程数,也就是平均活跃进程数,它和 CPU 使用率并没有直接关系

进程状态

linux中断机制

参考

什么是中断机制?

操作系统需要管理外设,但是外设的速度远远低于CPU的速度,所以我们需要一种机制来弥补这种速度鸿沟,提高CPU的效率。

为此我们引入了中断机制,让外设在需要操作系统处理外设相关事件的时候,能够主动通知操作系统,即打断操作系统和应用的正常执行,让操作系统完成外设的相关处理,然后在恢复操作系统和应用的正常执行。

当CPU收到中断或者异常的事件时,它会暂停执行当前的程序或任务,通过一定的机制跳转到负责处理这个信号的相关处理例程中,在完成对这个事件的处理后再跳回到刚才被打断的程序或任务中

硬中断

由与系统相连的外设(比如网卡、硬盘)自动产生的。主要是用来通知操作系统系统外设状态的变化。比如当网卡收到数据包的时候,就会发出一个中断。我们通常所说的中断指的是硬中断(hardirq)。

软中断

为了满足实时系统的要求,中断处理应该是越快越好。linux为了实现这个特点,当中断发生的时候,硬中断处理那些短时间就可以完成的工作,而将那些处理事件比较长的工作,放到中断之后来完成,也就是软中断(softirq)来完成。

buff/cache

过高时会导致物理内存占用过高

Swap交换分区

Swap分区在系统的物理内存不够用的时候,把硬盘内存中的一部分空间释放出来,以供当前运行的程序使用。那些被释放的空间可能来自一些很长时间没有什么操作的程序,这些被释放的空间被临时保存到Swap分区中,等到那些程序要运行时,再从Swap分区中恢复保存的数据到内存中

虚拟内存

虚拟内存计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。目前,大多数操作系统都使用了虚拟内存,如Windows家族的“虚拟内存”;Linux的“交换空间”等。

PHP json函数遇到的字符编码问题

参考

json_decode produces error “Single unpaired UTF-16 surrogate in unicode escape” and returns null

PHP json_decode does not work with single unpaired surrogate caused by Node 12 well-formed JSON.stringify

php json函数只能支持utf-8编码

在调取其它语言接口时,json_decode报错Single unpaired UTF-16 surrogate in unicode escape

解决方法一

正则替换掉无效\u开头的unicode字符,然后json_decode

 $contents = preg_replace('/(?<!\\\)\\\u[a-f0-9]{4}/iu', '', $contents);
 $json = json_decode($contents, true);

解决方法二

自定义json_decode方法

 public function customJsonDecode($json)
    {
        $comment = false;
        $out = '$x=';

        for ($i = 0; $i < strlen($json); $i++)
        {
            if (!$comment)
            {
                if (($json[$i] == '{') || ($json[$i] == '[')) $out .= ' array(';
                else if (($json[$i] == '}') || ($json[$i] == ']')) $out .= ')';
                else if ($json[$i] == ':') $out .= '=>';
                else
                    $out .= $json[$i];
            }
            else
                $out .= $json[$i];
            if ($json[$i] == '"' && $json[($i - 1)] != "\\")
                $comment = !$comment;
        }

        eval($out . ';');

        return $x;
    }

网络安全 渗透测试 知识汇总

常见攻击方式和漏洞

DDOS 和 CC 攻击

什么是 DDoS 攻击?-知乎

DDoS话题 -知乎

DDOS攻击和CC攻击分别是怎样的?-知乎

DDOS百度百科,ddos在传输层使用各种方式,挤兑占用服务器资源,造成正常用户无法访问。

CC攻击百度百科,cc攻击是ddos攻击的一种方式,在应用层,使用代理方式对服务器资源进行占用挤兑,造成正常用户无法访问。

防御

DDOS 攻击的防范教程 – 阮一峰

付费产品

游戏盾 WAF CloudFlare BGP高防IP

WEB常见漏洞

汇总一些常用的渗透测试方法和工具,用于安全测试

kail linux 渗透测试专用操作系统

渗透测试

https://github.com/GoVanguard/legion

https://github.com/secforce/sparta

sqlmap sql注入扫描工具

DNSLog

是一种回显机制,攻击者可以通过DNS的解析日志来读取漏洞执行的回显结果。  

http://www.dnslog.cn/

http://ceye.io

网络安全应急响应实战手册

服务器挖矿木马[kthreaddi]处理记录

参考

[kthreaddi]挖矿病毒处理,终于解决了!

Linux – kthreaddi 进程导致CPU超高问题 处理记录

处理服务器恶意程序 kthreaddi挖矿

记服务器被入侵挖矿病毒kthreaddi处理解决过程思路

第一次处理

使用参考链接2方式,清除了定时任务,kill -s 9 进程之后正常了。由于同事离职没有收到反馈并继续观察。

第二次处理

后续接手项目,发现又有了继续按原方法清理定时任务,发现一条特别的定时任务,路径在/data/wwwroot/default/phpmyadmin 下,[kthreaddi]进程用户是www可能是通过php web方式注入的。看了一下使用oneinstack脚本后没有删除默认工具目录,于是删除default目录。然后禁用nginx默认虚拟主机使其无法通过ip访问,使用安全组关闭其他端口只开放常用端口。

kill 进程,发现没有用还是会自动重启,看了参考链接1的方式,得到灵感猜想可能有另一个进程负责重启[kthreaddi]进程。使用netstat -ltnp命令发现了一个非法进程监听 52281端口

于是kill 掉 非法进程,然后kill 掉 [kthreaddi] 进程,top命令观察发现正常了。

总结

此类木马通过定时任务重启,也可能结合systemd 或init脚本开机自启, 也可能使用其它伪装的正常进程来重启

延展阅读,更复杂案例top查看不到进程

应急响应:记一次花样贼多的挖矿病毒

Linux挖矿木马的技术演进探讨

Laravel 响应文件

以实时响应二维码为例

public function qrcode($activity_id, $invite)
    {   
        //二维码内容
        $activity_url = config('app.activity_url') . '?' . http_build_query(['id' => $activity_id, 'invite' => $invite]);
        //二维码图片文件的二进制数据
        $qrcodeStr = Qrcode::format('png')->size(80)->generate($activity_url);
        //直接响应文件,并设置对应的响应头
        return response($qrcodeStr)->withHeaders([
            'Access-Control-Allow-Origin' => '*',
            'Access-Control-Allow-Headers' => '*',
            'Access-Control-Allow-Methods' => 'GET,POST,PUT,DELETE,PATCH,OPTIONS',
            'Content-Type' => 'image/png;charset=utf-8',
            'Content-Disposition' => 'inline;filename="' . $invite . '.png"'
        ]);
    }

框架实现原理,如上图所示,使用Symfony 组件响应字符串数据,就相当于原生php的

header(....);//设置文件响应头
echo $bindata;//输出文件的二进制数据字符串

Laravel 在SLB下获取客户端IP和正确加载Https访问样式

如果项目部署在云服务负载均衡下,会导致无法获取正确的客户端IP地址

解决方案

参考文档https://learnku.com/docs/laravel/8.x/requests/9369#453bc9

修改 App\Http\Middleware\TrustProxies 中间件 信任所有代理#

如果你使用 Amazon AWS 或其他的「云」的负载均衡服务,你可能不知道负载均衡器的实际 IP 地址。在这种情况下,你可以使用 * 来信任所有代理:
/**
 * 此应用的信任代理
 *
 * @var string|array
 */
protected $proxies = '*';

上述配置还可以解决,telescope和horizon在SLB下通过https访问无法正确加载样式和js问题

获取IP其它解决方案

参考https://help.aliyun.com/document_detail/54007.html?spm=a2c4g.11186623.6.933.5b203253t8UrIO

背景信息

七层负载均衡(HTTP/HTTPS协议)服务需要对应用服务器进行配置,然后使用X-Forwarded-For的方式获取客户端的真实IP地址。真实的客户端IP存放在HTTP头部的X-Forwarded-For字段,格式如下:

X-Forwarded-For: 用户真实IP, 代理服务器1-IP, 代理服务器2-IP,...

当使用此方式获取客户端真实IP时,获取的第一个地址就是客户端真实IP。

配置Nginx服务器

  1. 执行如下命令,安装http_realip_module。 wget http://nginx.org/download/nginx-1.0.12.tar.gz tar zxvf nginx-1.0.12.tar.gz cd nginx-1.0.12 ./configure --user=www --group=www --prefix=/alidata/server/nginx --with-http_stub_status_module --without-http-cache --with-http_ssl_module --with-http_realip_module make make install kill -USR2 `cat /alidata/server/nginx/logs/nginx.pid` kill -QUIT `cat /alidata/server/nginx/logs/ nginx.pid.oldbin`
  2. 执行如下命令,打开nginx.conf文件。vi /alidata/server/nginx/conf/nginx.conf
  3. 在以下配置信息后添加新的配置字段和信息。 fastcgi connect_timeout 300; fastcgi send_timeout 300; fastcgi read_timeout 300; fastcgi buffer_size 64k; fastcgi buffers 4 64k; fastcgi busy_buffers_size 128k; fastcgi temp_file_write_size 128k;需要添加的配置字段和信息为: set_real_ip_from IP_address; real_ip_header X-Forwarded-For;说明 如果您要获取代理服务器的地址,可以将代理服务器的网段添加到set_real_ip_from <IP_address>,如负载均衡的IP地址段100.64.0.0/10(100.64.0.0/10 是阿里云保留地址,其他用户无法分配到该网段内,不会存在安全风险)和高防IP地址段。多个IP地址段用逗号分隔。
  4. 执行如下命令,重启Nginx。/alidata/server/nginx/sbin/nginx -s reload

然后获取请求头

//原生
$_SERVER['X-Forwarded-For'];
//laravel
$request->header('X-Forwarded-For');

HTTP监听访问正常但是HTTPS监听访问网址不加载样式

https://help.aliyun.com/document_detail/178368.htm?spm=a2c4g.11186623.2.17.116f7503fHVPRT