Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.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
Sql injection 获取SQL注入的结果集_Sql Injection - Fatal编程技术网

Sql injection 获取SQL注入的结果集

Sql injection 获取SQL注入的结果集,sql-injection,Sql Injection,假设服务器端代码如下所示: String id = getIdFromHttpRequest(); String value = getValueFromHttpRequest(); ResultSet rs = new ResultSet(); String query = "INSERT INTO users VALUES ('" + id + "', '" + value + "');" rs = SQL.doQuery(query); // i know it's not the sy

假设服务器端代码如下所示:

String id = getIdFromHttpRequest();
String value = getValueFromHttpRequest();

ResultSet rs = new ResultSet();
String query = "INSERT INTO users VALUES ('" + id + "', '" + value + "');"
rs = SQL.doQuery(query); // i know it's not the syntax, but the point is clear
嗯,注入很容易,我可以让它执行一个SQL命令,但问题是我想看到结果集(我注入SELECT命令)


有没有办法做到这一点?

你可能无法做到这一点

正如您所知,即使使用SQL注入,INSERT语句也没有结果集。充其量,您可以让它作为标量子查询执行SELECT。不难模仿您的示例来执行以下操作:

INSERT INTO users VALUES ('8675309', '' || (SELECT ...blah blah...) || '');
但这仍然不会返回结果集,因为INSERT从来没有结果集

您需要执行第二个查询才能执行该操作。某些查询接口在对doQuery()的单个调用中支持多查询,但这并不总是正确的(取决于您使用的数据库品牌,可能还有一些配置选项)

使用SQL注入,您可以操作SQL,但无法操作运行SQL的应用程序中的其余代码。在您展示的示例中,应用程序设计为运行插入查询,而不是在插入后再执行选择。执行插入后,应用程序将没有理由获取结果集

很难想象您如何单独使用SQL注入来欺骗您显示的代码以获取和显示结果集


我认为不可能使用SQL注入通过利用非读取查询来读取数据。

有很多关于SQL注入攻击的资料。一般的想法是,查询是动态生成的,注入绕过了只插入典型用户输入(参数值)的预期场景。你是对的,但我的问题是,服务器不会打印结果集(它希望它执行INSERT命令),我怎么能看到值,这就是为什么您必须找到创造性的方法来继承现有系统的功能。我知道INSERT命令不会返回任何内容,这就是问题所在。我不能更改服务器的代码,只能通过数据、值注入代码。我的问题是-我能以某种方式查看我正在注入的SELECT命令的结果吗?顺便说一句,我想到的注入不是使用字符串连接,而是类似value=“”);从用户中选择*,其中“1”=“1”,类似于上面的第二个示例。如果应用程序代码不是为获取结果而设计的,那么仍然无法让应用程序代码获取结果。此外,还不能确定查询API是否在一次调用中接受多个查询。例如,MySQL默认情况下不支持多查询,它需要一个连接选项。关于你的第二条评论——这是我没有提到的错误,我假设API支持多个查询。
INSERT INTO users VALUES (...whatever...);
SELECT * FROM secure_table WHERE (id = '8675309');