“图片不是文本文件能往里边写代码吗?”
“你说的是水印吧?”
真的能写,并且不是水印!下面有请今天的 Web Shell 样本:
你没有看错,就是上边这张小图、一张一堆小点、看似损坏了的小图片(文末有放大版)。
我们知道RGBA颜色由4个数值组成,依次是红色、绿色、蓝色、透明度,这4个值中除了透明度A外都可以用0到255的数字表示,而0-255刚好可以容纳ASCII字符(A只能用0到100表示,不能存储大于100的ASCII字符)。那么如果把每个像素中除了A外的三种颜色当作字母的ASCII码会是什么样子呢?
我们来看看它里边有什么,我们依次取出前10个像素的颜色值看一下:
黑色 --> rgba( 32, 32, 32, 100) --> 32, 32, 32 --> 空格 空格 空格 青色 --> rgba( 32,118, 97, 100) --> 32,118, 97 --> 空格 v a 紫色 --> rgba(114, 32, 84, 100) --> 114, 32, 84 --> r 空格 T 棕色 --> rgba( 88, 53, 49, 100) --> 88, 53, 49 --> X 5 1 粉色 --> rgba(116,111,110, 100) --> 116,111,110 --> t o n 灰色 --> rgba(103,106,105, 100) --> 103,106,105 --> g j i 绿色 --> rgba( 95,111, 72, 100) --> 95,111, 72 --> _ o H 灰色 --> rgba(101, 97,100, 100) --> 101, 97,100 --> e a d 粉色 --> rgba( 32, 61, 32, 100) --> 32, 61, 32 --> 空格 = 空格 黄色 --> rgba(100,111, 99, 100) --> 100,111, 99 --> d o c
把上边对应的字符整理一下:
var TX51tongji_oHead = doc
好神奇啊,居然是一句代码!
好了,本文就到这里,有兴趣的可以去看一下里边的完整代码。
放大版图片:
补充:
1. png图片数据区域的存储规则为每4个值为1个像素即“红色值、绿色值、蓝色值、透明度,红色值、绿色值、蓝色值、透明度,……”,例子:32,32,32,255; 32,118,97,255; 114,32,84,255; 88,53,49,255; 116,111,110,255; 103,106,105,255; 95,111,72,255; 101,97,100,255; 32,61,32,255; 100,111,99,255;……
2. ASCII 的可打印(看得见的)字符的10进制范围是从32到127。
<完>