我正在做关于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()
这样的特定功能?
答案 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;'
更难。