Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.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注入_Php_Mysql_Sql_Security_Sql Injection - Fatal编程技术网

Php 奇怪的SQL注入

Php 奇怪的SQL注入,php,mysql,sql,security,sql-injection,Php,Mysql,Sql,Security,Sql Injection,早些时候,我在查看好友的网站时,遇到了我遇到过的最奇怪的SQL错误。PHP文件是add\u cart\u new.PHP?id=,它将向购物者的购物车添加产品 如果您有add\u cart\u new.php?id=184',您会得到一个错误,上面写着: 您的SQL语法有错误;请查看与MySQL服务器版本对应的手册,以了解第1行“%”附近要使用的正确语法 插入购物车集合会话\u id='1ibltcqbpziwstrilad0e9p61bztnu',product=184' 吸引我的是第1行的'

早些时候,我在查看好友的网站时,遇到了我遇到过的最奇怪的SQL错误。PHP文件是
add\u cart\u new.PHP?id=
,它将向购物者的购物车添加产品

如果您有
add\u cart\u new.php?id=184'
,您会得到一个错误,上面写着:

您的SQL语法有错误;请查看与MySQL服务器版本对应的手册,以了解第1行“%”附近要使用的正确语法

插入购物车集合会话\u id='1ibltcqbpziwstrilad0e9p61bztnu',product=184'

吸引我的是第1行的
''

我试着做一些其他的事情,比如进入:

add\u cart\u new.php?id=add\u cart\u new.php&return=d4.php

我猜这会被认为是本地文件包含漏洞

无论如何,这导致了这个错误:

“字段列表”中的未知列“add\u cart\u new.php”

插入购物车集合会话\u id='1ibltcqbpziwstrilad0e9p61bztnu',product=add\u cart\u new.php


我已经做了很多研究,但是有没有什么方法可以让人利用它来获取敏感信息呢?我看过很多指南,也试过很多东西。它们都不起作用。

这一点也不奇怪,这是一种非常常见的易受攻击代码

吸引我的部分是第1行的“.”

这意味着MySQL报告说,它不希望在SQL语句末尾出现引号字符:

insert into cart set session_id='1ibltcqbpziwstrilad0e9p61bztnu',product=184'
根据SQL,最后一个引号是一个语法错误。通常情况下,MySQL语法错误消息会在看到它没有预料到的内容之后包含更多的文本,但由于在本例中是语句的结尾,因此在错误中只有一个引号字符要报告

“字段列表”中的未知列“add\u cart\u new.php”

插入购物车集合会话\u id='1ibltcqbpziwstrilad0e9p61bztnu',product=add\u cart\u new.php

在INSERT语句中,将字段设置为表达式是合法的语法,它允许使用
tablename.columnname
语法。诚然,它在INSERT中没有多大意义,但它是合法的表达式语法

这是SQL解析器将
add\u cart\u new.php
解释为标识符的唯一可行方法,其中
add\u cart\u new
是表名,
php
是列名

有人真的可以利用它来获取敏感信息吗

是的,很多。例如,攻击者可以使用子查询作为表达式,然后从web应用程序具有读取权限的数据库中的任何其他位置将数据加载到他们的购物车中

或者他们可以使用一个表达式,其中包含一个访问数据库外部资源的函数,如
LOAD\u FILE()

或者,他们可以使用文字逗号字符,让INSERT语句设置其他字段,这些字段可以更改为产品支付的价格,也可以更改产品将向谁计费

或者他们可以使用文字分号字符,并在INSERT之后执行另一整条语句

SQL注入是阴险的,肇事者的动机是非常聪明的。只需遵循正确的编码实践并使用查询参数,而不是将$\u GET变量直接复制到SQL字符串中。

是一种允许更改查询形状的攻击

从以下不带占位符的假设查询开始,如错误所示,没有其他转义:

insert into cart set session_id=$session,product=$v
然后这表示SQL注入漏洞,因为可以注意到
id=184'
影响
$v
。在提出的初始值中,它只会导致[良性]无效的SQL语法,但是

A$v的价格类似于:

0; DELETE FROM users;
这将被替换为
插入..,product=0;从用户中删除显然不好的
。现在,一些PHP提供程序默认情况下不允许多语句,这缓解了这种情况,但是。。想象一下,如果$v仅仅是

184,special_price=0
现在,结果查询将是
插入..,product=0,special_price=0
,并且,对这种购物车的工作原理做了一些其他假设假设,我们刚刚授予了一个免费产品

SQL注入的问题——无论是单个语句还是多个语句——在于它为利用SQL注入打开了大门。目前的情况可能无法利用,但每扇打开的门/窗都会增加被抢劫的机会


(这就是我和其他许多人对所有数据使用查询的原因,查询可以消除SQL注入。)

显示正确的利用SQL代码的方法是不受欢迎的,因为它为那些想要恶意使用这些知识的人打开了教育的大门。把这个错误当作一个耳光来修复代码,这样普通用户就不会认为你的网站被破坏了。应该始终遵循最佳实践,因为信不信由你,这个网站上有比任何人都聪明的人,他们会在几秒钟内摧毁你好友的网站。@MonkeyZeus讨论SQL注入是如何工作的,这很难让人不高兴。不让程序员知道SQL注入是什么以及它是如何工作的(除了“它是危险的”)就像是拿着毛巾——如果你看不见它,它就看不见你。(然而,在网上可以通过-维基百科是否值得“皱眉”?-等获得一些微不足道的利用漏洞的例子。)@user2864740你的说法相当于说每个使用防弹衣的人都应该学习如何制造子弹。@MonkeyZeus不,不是真的(尽管我认为制造子弹没有问题)。相反,我认为,如果你对某人说,“穿上这件背心,它会保护你的安全”,你应该能够支持这一点。这应该包括解释背心是如何工作的,它保护了什么(不保护什么),甚至可能是模拟的现场体验。@MonkeyZeus不理解SQL注入导致使用
mysql\u real\e