1 php 多字节绕过escapeshellcmd

escapeshellcmd()对shell元字符过滤加反斜杠;

反斜线(\)会在以下字符之前插入: #&;`|*?~<>^()[]{}$, \x0A 和 \xFF,但在php5.2.5及之前存在通过输入多字节绕过escapeshellcmd的问题。5.2.6 已经修复了该问题。

执行 escapeshellcmd("echo ".chr(0xc0).";id");

加上反斜杠之后,也就是echo \xc0\x5c;id,在中文环境中\xc0\x5c是会被认为是gbk字符的。>>> hex(ord('\\'))

'0x5c'

>>> s='\xc0\x5c'

>>> print s.decode('gbk').encode('utf8')

>>> s.decode('gbk').encode('utf8')

'\xe7\xb9\xba'

\被吃掉之后于是就变成了echo 繺;id 了。

gbk是宽字节,两个字节,gbk字符范围:8140-FEFE,首字节在81-FE直接,尾字节在40-FE之间,显然5C在尾字节中。考虑0xbf;id,escape之后就变成了0xbf5c;id,0xbf5c是一个合法的GBK编码,那就变成了[0xbf5c];id了。而utf8表示中文一般三个字节。

同样受影响的还有escapeshellarg(),源码中的处理是一个字节一个字节来处理的。这种漏洞应该有一定普遍性,在当时来说。下面我们看下修复的源代码:char *php_escape_shell_cmd(char *str) {

register int x, y, l;

char *cmd;

char *p = NULL;

TSRMLS_FETCH();

l = strlen(str);

cmd = safe_emalloc(2, l, 1); //申请了2倍字符

for (x = 0, y = 0; x < l; x++) {

int mb_len = php_mblen(str + x, (l - x));

//这一段是5.2.6新加的,就是在处理多字节符号的时候,当多字节字符小于0的时候不处理,大于1的时候跳过,等于1的时候执行过滤动作

/* skip non-valid multibyte characters */

if (mb_len < 0) {

continue;

} else if (mb_len > 1) {

memcpy(cmd + y, str + x, mb_len);

y += mb_len;

x += mb_len - 1;

continue;

}

switch (str[x]) {

case '"':

case '\'':

#ifndef PHP_WIN32

if (!p && (p = memchr(str + x + 1, str[x], l - x - 1))) {

/* noop */

} else if (p && *p == str[x]) {

p = NULL;

} else {

cmd[y++] = '\\';

}

cmd[y++] = str[x];

break;

#endif

case '#': /* This is character-set independent */

case '&':

case ';':

case '`':

case '|':

case '*':

case '?':

case '~':

case '

case '>':

case '^':

case '(':

case ')':

case '[':

case ']':

case '{':

case '}':

case '$':

case '\\':

case '\x0A': /* excluding these two */

case '\xFF':

#ifdef PHP_WIN32

/* since Windows does not allow us to escape these chars, just remove them */

case '%':

cmd[y++] = ' ';

break;

#endif

cmd[y++] = '\\';

/* fall-through */

default:

cmd[y++] = str[x];

}

}

cmd[y] = '\0';

return cmd;

}

这个bypass已经成为过去时了,但是还是有很大的借鉴意义,就是宽字节注入,这种情况不仅仅发生命令注入时,更多的时候在sql注入,下面来分析一下宽字节注入如下三种情况,都是由于宽字节的问题导致的。

2 宽字节sql注入

1,一种情况 iconv转换,addslashes之后从gbk转到utf8$user = $_POST[ 'username' ];

$user = addslashes($user);

$user = iconv("gbk", 'utf8', $user);

$pass = $_POST[ 'password' ];

$pass = md5( $pass );

$qry = "SELECT * FROM `users` WHERE user='$user' AND password='$pass';";

print_r($qry);

$result = @mysql_query($qry) or die('

' . mysql_error() . '

' );

var_dump($result);

处理过程如下:

%bf%27----(addslashes)->%bf%5c%27-----(utf8)---->縗' 这样单引号就放出来了,大体流程是%bf%27经过addslashes之后变成了%bf%5c%27,再经过iconv从gbk转换为utf8的时候,变成了%e7%b8%97%27,也就是縗'。利用的前提是设置了set names utf8。

2,在php中使用mysql_query('set names gbk'),指定了客户端,连接层,结果为gbk编码。构造数据%bf%27,过程和第一种情况类似

%bf%27---(addslashes)-->%bf%5c%27---(set names gbk)--->縗'

3,iconv转换从utf8到gbk,set names字符集为gbk,构造数据如下%e9%8c%a6带入反斜杠,注释掉单引号

大体数据流程:%e9%8c%a6-----(utf8)----%e5%5c----(addslashes)--->%e5%5c%5c>>> s = '\xe9\x8c\xa6'

>>> s.decode('utf8')

u'\u9326'

>>> s.decode('utf8').encode('gbk')

'\xe5\\'

总之一条,都是打的%5c的注意,要么转义后转utf8吃掉%5c,要么转utf8后再转义放出%5c

php escapeshellcmd,从escapeshellcmd bypass说起到宽字节注入相关推荐

  1. SQL注入教程——(四)宽字节注入

    前言 在mysql中,用于转义(即在字符串中的符号前加上"\")的函数有addslashes,mysql_real_escape_string,mysql_escape_strin ...

  2. CTF从入门到提升之宽字节注入

    CTF入门到放弃 为什么说是从入门到放弃呢?(开个玩笑)如果说大家对CTF有了解的话,其实应该知道CTF是一个什么类型的比赛,这个比赛涉及的范围和影响有多大.如果说你真的想打好比赛,那也是真的非常不容 ...

  3. 【每天学习一点新知识】跟咩咩一起学“宽字节注入”

    目录 什么是宽字节? 宽字节注入原理 常用URL编码 sqli-labs实例 判断是否存在漏洞 判断列数及回显 获取数据 宽字节注入的预防 什么是宽字节? 如果一个字符的大小是一个字节的,称为窄字节: ...

  4. oracle宽字节注入,CTF-sql-宽字节注入

    本文章主要涉及sql宽字节注入注入的原理讲解,如有错误,望指出.(附有目录,如需查看请点右下角) 一.下图为本次文章所使用到 user表,该表所在的数据库为 test. 二.首先介绍一下本篇文章所用到 ...

  5. java 宽字节_宽字节注入

    宽字节注入 原理:宽字节(两字节)带来的安全问题主要是吃ASCII字符(一字节)的现象,使用一些特殊字符来"吃掉"经过转义符 " \ " . 在重新详细了解宽字 ...

  6. MySQL宽字节注入漏洞分析_宽字节注入

    概念 单字节字符集: 所有的字符都使用一个字节来表示,比如 ASCII 编码. 多字节字符集: 在多字节字符集中,一部分字节用多个字节来表示,另一部分(可能没有)用单个字节来表示. 两位的多字节字符有 ...

  7. mysql 宽字符注入_sql注入 宽字节注入

    宽字节注入 宽字节注入是利用mysql的一个特性,mysql在使用GBK编码的时候,会认为两个字符是一个汉字(ascii码要大于128,才到汉字的范围), 而当我们输入有单引号时会自动加入\进行转义而 ...

  8. sql注入_1-8_宽字节注入

    文章目录 一.sql_宽字节注入概念 二.sql_宽字节注入源码分析 三.sql_宽字节注入演示 四.sql_宽字节注入总结 一.sql_宽字节注入概念 1.了解宽字节注入前,必须先了解字符集编码:点 ...

  9. mysql sql宽字节注入_sql注入之宽字节注入

    宽字节注入是因为数据库使用了GBK编码,不过现在大都使用unicode国际编码,大多数网站都使用了utf-8的编码 不过既然是sql注入的一部分,也搭建环境  做做实验 实验环境: wamp集成包 实 ...

最新文章

  1. CSS代码检查工具stylelint
  2. iOS 不要使用tag传递TableViewCell的indexPath值
  3. android 登录qq接口开发,三方登录-QQ登录开发-Android(as版本)
  4. vue限制点击次数_如何处理vue按钮多次点击重复提交数据
  5. vue.js笔记1.0
  6. JAVA 函数的重载
  7. otsu阈值分割算法原理_OpenCV学习30--阈值分割的OTSU算法
  8. 用代码实现自反闭包,对称闭包,传递闭包
  9. Java 对上传文件后缀格式的校验
  10. 第二章 03 藤蔓生长
  11. 如何使用jupyter notebook的PPT插件rise进行分页显示
  12. 服务器部署 winscp+putty
  13. c++使用vector求矩阵的A的逆
  14. SU几种偏移测试 转自[蠢树]
  15. 八大基本数据类型(primitive type)
  16. matlab求异面直线的公垂线,求异面直线的公垂线
  17. 【C++编程语言】之string容器 基本概念 构造函数 赋值 拼接 查找 替换比较 插入 删除 子串获取
  18. 《星际争霸》单位语音中英文完全版
  19. C/C++中的指针*是靠近数据类型还是靠近数据变量书写?
  20. 使用asm.jar将Android手机屏幕投影到电脑

热门文章

  1. spring源码分析3,java技术面试评语及录用建议
  2. windows10环境下QtCreator中出现skipping incompatible xxx when searching for xxx 问题解决办法
  3. 图像分割 | 人体实例分割数据
  4. html的tabindex属性,让普通元素能够执行聚焦(foucs)和失焦(blur)事件
  5. 知识管理 | 从做笔记到知识管理的探索之路
  6. 电磁兼容01 EMC概论
  7. 函数解剖——深挖getchar()与putchar()
  8. PHP json 类型
  9. 利用Sigrity的SPEED2000进行时域电源噪声分析
  10. -已解决-word粘贴时快捷键实现只保留文本