php escapeshellcmd,从escapeshellcmd bypass说起到宽字节注入
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说起到宽字节注入相关推荐
- SQL注入教程——(四)宽字节注入
前言 在mysql中,用于转义(即在字符串中的符号前加上"\")的函数有addslashes,mysql_real_escape_string,mysql_escape_strin ...
- CTF从入门到提升之宽字节注入
CTF入门到放弃 为什么说是从入门到放弃呢?(开个玩笑)如果说大家对CTF有了解的话,其实应该知道CTF是一个什么类型的比赛,这个比赛涉及的范围和影响有多大.如果说你真的想打好比赛,那也是真的非常不容 ...
- 【每天学习一点新知识】跟咩咩一起学“宽字节注入”
目录 什么是宽字节? 宽字节注入原理 常用URL编码 sqli-labs实例 判断是否存在漏洞 判断列数及回显 获取数据 宽字节注入的预防 什么是宽字节? 如果一个字符的大小是一个字节的,称为窄字节: ...
- oracle宽字节注入,CTF-sql-宽字节注入
本文章主要涉及sql宽字节注入注入的原理讲解,如有错误,望指出.(附有目录,如需查看请点右下角) 一.下图为本次文章所使用到 user表,该表所在的数据库为 test. 二.首先介绍一下本篇文章所用到 ...
- java 宽字节_宽字节注入
宽字节注入 原理:宽字节(两字节)带来的安全问题主要是吃ASCII字符(一字节)的现象,使用一些特殊字符来"吃掉"经过转义符 " \ " . 在重新详细了解宽字 ...
- MySQL宽字节注入漏洞分析_宽字节注入
概念 单字节字符集: 所有的字符都使用一个字节来表示,比如 ASCII 编码. 多字节字符集: 在多字节字符集中,一部分字节用多个字节来表示,另一部分(可能没有)用单个字节来表示. 两位的多字节字符有 ...
- mysql 宽字符注入_sql注入 宽字节注入
宽字节注入 宽字节注入是利用mysql的一个特性,mysql在使用GBK编码的时候,会认为两个字符是一个汉字(ascii码要大于128,才到汉字的范围), 而当我们输入有单引号时会自动加入\进行转义而 ...
- sql注入_1-8_宽字节注入
文章目录 一.sql_宽字节注入概念 二.sql_宽字节注入源码分析 三.sql_宽字节注入演示 四.sql_宽字节注入总结 一.sql_宽字节注入概念 1.了解宽字节注入前,必须先了解字符集编码:点 ...
- mysql sql宽字节注入_sql注入之宽字节注入
宽字节注入是因为数据库使用了GBK编码,不过现在大都使用unicode国际编码,大多数网站都使用了utf-8的编码 不过既然是sql注入的一部分,也搭建环境 做做实验 实验环境: wamp集成包 实 ...
最新文章
- CSS代码检查工具stylelint
- iOS 不要使用tag传递TableViewCell的indexPath值
- android 登录qq接口开发,三方登录-QQ登录开发-Android(as版本)
- vue限制点击次数_如何处理vue按钮多次点击重复提交数据
- vue.js笔记1.0
- JAVA 函数的重载
- otsu阈值分割算法原理_OpenCV学习30--阈值分割的OTSU算法
- 用代码实现自反闭包,对称闭包,传递闭包
- Java 对上传文件后缀格式的校验
- 第二章 03 藤蔓生长
- 如何使用jupyter notebook的PPT插件rise进行分页显示
- 服务器部署 winscp+putty
- c++使用vector求矩阵的A的逆
- SU几种偏移测试 转自[蠢树]
- 八大基本数据类型(primitive type)
- matlab求异面直线的公垂线,求异面直线的公垂线
- 【C++编程语言】之string容器 基本概念 构造函数 赋值 拼接 查找 替换比较 插入 删除 子串获取
- 《星际争霸》单位语音中英文完全版
- C/C++中的指针*是靠近数据类型还是靠近数据变量书写?
- 使用asm.jar将Android手机屏幕投影到电脑
热门文章
- spring源码分析3,java技术面试评语及录用建议
- windows10环境下QtCreator中出现skipping incompatible xxx when searching for xxx 问题解决办法
- 图像分割 | 人体实例分割数据
- html的tabindex属性,让普通元素能够执行聚焦(foucs)和失焦(blur)事件
- 知识管理 | 从做笔记到知识管理的探索之路
- 电磁兼容01 EMC概论
- 函数解剖——深挖getchar()与putchar()
- PHP json 类型
- 利用Sigrity的SPEED2000进行时域电源噪声分析
- -已解决-word粘贴时快捷键实现只保留文本