我可以在哪种Web语言中使用SQL注入执行多个查询?

时间:2013-09-30 21:20:15

标签: php mysql jsp web sql-injection

我正在做关于Web漏洞的大学工作,我需要在实践中演示一些漏洞,特别是SQL注入。我开发了两个应用程序,一个用PHP,一个用JSP,但是没有一个接受多个查询,我需要从SQL注入脚本执行DROP TABLE

所以我已经知道mysql_query()转义了多个查询,Statement.execute()也是如此,我还没有尝试使用ASP.NET。但是,ASP.NET是唯一允许以最简单的查询语法使用的Web语言吗?像mysql_query()是PHP最简单的语法,而st.execute()是JSP最简单的语法,这意味着很多Web应用程序都使用这种语法。

JSP

String query = "SELECT * from user; DROP TABLE user;-- ";
st = con.createStatement();
st.execute(query);

PHP

mysql_query("SELECT * from user; DROP TABLE user;-- ");
编辑:我不太清楚,我正在制作一个易受攻击的登录应用程序,我需要DROP一个带有SQL注入的表,就像在查询中一样:

"SELECT * FROM user where user ='".$_POST['user']."' AND pass = md5('".$_POST['pass']."')";

我传入用户字段'; DROP TABLE用户; - ',我的问题是,哪种网络语言允许我这样做而不使用像mysqli_multi_query()这样的特定功能?

4 个答案:

答案 0 :(得分:0)

这不是语言限制。 Web的任何服务器端语言都可以执行多个查询(我一直这样做)。但你的问题并没有多大意义。你想传递一个庞大的SQL文件来做一堆操作吗?或者您是否想要执行特定于数据/事件的操作,例如基本的CRUD功能(创建,读取,更新,删除)?

所有语法都很简单。但是如果你真的想混淆它以进一步简化它,那么使用ORM,例如Laravel框架附带的Eloquent系统。

虽然老实说,我认为你只需花费大量时间学习SQL和你喜欢的网络语言。我会说,PHP是绝大多数Web开发的地方。它上面有很多资源。

编辑: 由于您确实在同一个呼叫中运行多个查询,因此可以使用此处描述的功能:http://raamdev.com/2008/multiple-query-problems-with-mysql_query/

A.K.A。:mysqli :: multi_query - http://www.php.net/manual/en/mysqli.multi-query.php

答案 1 :(得分:0)

另一种可能性是你可以尝试一些迂回的方式。例如让PHP调用shellexec()并通过PHP通过MySQL控制台命令行运行所有SQL语句。鉴于此处命令行的交互性,我甚至不确定这是否可以完成。

不幸的是,它并不是一种可以说是常用的方式。似乎所有的输入都表明它现在无法直接完成。至少不是多查询注入限制。但这并不意味着没有其他SQL注入攻击可能发生。

我能想到的一件事是使用评论或子查询。使用注释,您将不得不花费大量时间来制定解决方案,从而在注入的SQL的末尾添加“ - ”以关闭SQL语句的其余部分。如果您的代码到达之后有任何换行符,这将是有问题的。但是使用子查询似乎更有可能。

对于子查询,您要做的是将搜索查询中的值放入WHERE子句中。

示例...

从这个查询开始:

SELECT * FROM students WHERE first_name = 'bobby'; -- Bobby being an unsanitized value.

变为:

SELECT * FROM students WHERE first_name = 'bobby' AND (DELETE FROM students WHERE student_id > 0) = true AND '' = '';

在我的第二个例子中,我注入了这个:

' AND (DELETE FROM students WHERE student_id > 0) = true AND '' = '

利用子查询方法注入动作语句。查看SQL标准页面:http://www.w3resource.com/sql/subqueries/understanding-sql-subqueries.php

答案 2 :(得分:-1)

实际上很奇怪你不能使用'DROP TABLE方法SQL注入你自己的易受攻击的代码。

我会尝试使用mysqli函数,包括多查询函数,应该是mysqli_multi_query()

请注意,PHP 5中已经引入了对mysqli的PHP支持。

编辑:请阅读您关于了解此功能的评论。我认为这是最简单的方法。

答案 3 :(得分:-1)

这不是网络语言的问题。这是MySQL在单个准备中不允许多个语句。请参阅有关预准备陈述的文档:

https://dev.mysql.com/doc/refman/5.0/en/sql-syntax-prepared-statements.html

在该页面的末尾附近有这个片段:

  

预准备语句的SQL语法不支持多语句(即,单个字符串中的多个语句由“;”字符分隔

这将使得使用规范'Bobby'; DROP TABLE STUDENTS;'更难。