Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php SQL注入相关:为什么我的SQL查询只返回部分带有连接的值?_Php_Mysql_Sql_Sql Injection - Fatal编程技术网

Php SQL注入相关:为什么我的SQL查询只返回部分带有连接的值?

Php SQL注入相关:为什么我的SQL查询只返回部分带有连接的值?,php,mysql,sql,sql-injection,Php,Mysql,Sql,Sql Injection,我正在努力理解我的问题是什么。也许我不明白串联是如何工作的? 在MySQL版本5.5.40-0+喘息1中,会发生以下情况: firstname='something' salt='123456' php中的常规查询是 UPDATE users SET firstname='$name' WHERE id=:uid; 我尝试将SQL注入firstname区域: '+ (SELECT s FROM (SELECT salt as s FROM users WHERE username='some

我正在努力理解我的问题是什么。也许我不明白串联是如何工作的? 在MySQL版本5.5.40-0+喘息1中,会发生以下情况:

firstname='something'
salt='123456'
php中的常规查询是

UPDATE users SET firstname='$name' WHERE id=:uid;
我尝试将SQL注入firstname区域:

'+ (SELECT s FROM (SELECT salt as s FROM users WHERE username='something') AS saltEntry)+'
所以完整的查询是

UPDATE users SET firstname=''+ (SELECT s FROM (SELECT salt as s FROM users WHERE username='something') AS saltEntry)+'' WHERE id=:uid;
结果仅出现在firstname区域12或123中,而不会出现完整字符串

同样当我输入:test'+selects FROM selectsalt as s FROM username='something'as saltEntry+'

它也只返回12或123作为名字

但是,当我在SQL server中试用时,没有'or+:UPDATE users SET firstname=SELECT s FROM SELECT salt as s FROM users WHERE username='something'as saltEntry WHERE id=:uid; 它将整个salt复制到firstname条目中,并且可以正常工作

我想知道我做错了什么

编辑1: 根据@eggyal,如果这个MySQl+是唯一的算术运算符。我不能使用Concat,因为只有一个引号“开始”。然后如何将子查询插入到查询中

回答:@eggyall在评论中。

使用CONCAT: 您可以使用concat函数连接多个字符串,并将firstname和salt作为参数传递,以获得所需的结果:

UPDATE users SET firstname= CONCAT(firstname, (SELECT s FROM (SELECT salt as s FROM users WHERE username='something') AS saltEntry)) WHERE id=:uid;

问题是“+”是一个只能应用于数字的运算符。它不连接两个值,而是对它们求和。现在,当您将其应用于字符串时,MySQL首先将字符串转换为始终等于0的数字,并将该值添加到下一个操作数。因此,如果有数值操作数,结果总是等于数值操作数

正如您已经想到的,CONCAT是这里使用的正确选项

如果您不特别需要将select字符串附加到查询中,我建议对其进行一些改进,以避免在其中嵌套太多查询

由于执行了更新,因此不能将值作为对同一表的嵌套查询的结果。但是,您可以使用join,这将使您的查询更简单、更优化

UPDATE users as original 
JOIN users as salts USING(user_id) 
SET original.firstname = CONCAT({$first_name},salts.salt) 
WHERE salts.username='something'

尽管名称中都有SQL首字母缩写,但Oracle公司拥有的MySQL和Microsoft拥有的SQL Server是完全不同的程序。我已经相应地修复了问号。在SQL中,+是算术加法运算符而不是字符串连接。所以我只能使用CONCAT@eggyal那么在关闭“”时如何进行注入呢?例如,您可以更新多个列。例如,updateusers SET firstname='then inject',姓氏=SELECT…,middleInitial=',由'WHERE id=:uid;完成;。您甚至可以第二次更新firstname列,并使用用户变量放弃最终的引号,即通过注入',firstname=SELECT…,@dummy='。或者,如果恰好启用了SQL模式,您可以使用| |运算符来执行字符串连接。祝您好运,在预期字符串文字的开头引号之前插入CONCAT!我不清楚他是否想连接SQL的字符串值,所以我的答案是基于SQL的计算,而不是SQL本身。是的,我想连接,但更重要的是注入我的子查询。答案是,不是+。感谢您帮助@ShadiShaabanI,我认为您没有抓住要点,OP试图通过一个未替换的字符串文本注入SQL。也许,我以为OP是在问如何注入SQL,因为这是他/她想到的唯一方法,而不是具体的请求。我想知道这一点会很有帮助,但我无法发表评论,因为我仍然没有足够的声誉这么做,所以我将其粘贴为单独的答案: