通过前期的 WEB 漏洞的学习,掌握了大部分的安全漏洞的原理及利用,但在各种脚本语言开发环境的差异下,会存在新的安全问题,其中脚本语言类型 PHP,Java,Python 等主流开发框架会有所差异。
Javaweb-SQL 注入攻击-预编译机制绕过
- SQL注入的防御
---防御 sql 注入:1.session2.参数绑定存储过程
利用 session 防御
---session 内容正常情况下是用户无法修改的
---select * from users where user = "'" +session.getAttribute("UserID") + "'";(session在服务器内)
参数绑定方式,利用了 sql 的预编译技术
---常用Statement、PreparedStatement 和 CallableStatement三种方式来执行查询语句,其中 Statement 用于通用查询, PreparedStatement 用于执行参数化查询,而 CallableStatement则是用于存储过程。
---Statement 该对象用于执行静态的 SQL 语句,并且返回执行结果。 此处的SQL语句必须是完整的,有明确的数据指示。查的是哪条记录?改的是哪条记录?都要指示清楚。
---PreparedStatement ,SQL 语句被预编译并存储在 PreparedStatement 对象中。然后可以使用此对象多次高效地执行该语句。(这里是PreparedStatement不允许一个占位符(?)有多个值,注入的语句也就不会被执行)
---在使用参数化查询的情况下,数据库系统不会将参数的内容视为SQL指令的一部分来处理
---而是在数据库完成SQL指令的编译后,才套用参数运行,因此就算参数中含有破坏性的指令,也不会被数据库所运行。
---String query = "SELECT * FROM users WHERE last_name = ?";// 不允许一个占位符(?)有多个值
---PreparedStatement statement = connection.prepareStatement(query);
---statement.setString(1, accountName);
---ResultSet results = statement.executeQuery(); ---上面说的方式也不是能够绝对的进行 sql 注入防御,只是减轻。如参数绑定方式可以使用下面方式绕过。
---通过使用 case when 语句可以将 order by 后的 orderExpression 表达式中添加 select 语句。(原理类似堆叠注入,一条语句出现多条命令)
---构造语句(说实话我看不懂这个语句,应该是):
select id, hostname, ip, mac, status, description from servers where status <> 'out of order' order by " + case when(select substr(ip,{0},1)='{1}' from servers where hostname='webgoat-prd')
---根据报错构造Python脚本(webgoat在虚拟机里,不能用Python脚本跑)
---设置请求数据的数据头,和cookie
---设置请求的代理,也就是先发送给抓包工具
---resp为request请求(目标URL,请求头(XML格式),cookie,代理)
---如果webgoat-acc字符串在返回的json数据的第一个元素的主机名,就认为是对的,就输出结果(emmmm感觉不太懂,只理解了如果是Java语句的SQL如果是预编译的的话,基本不能注入。除非存在order by,可以用order by case when 来构造查询语句(具体构造也不太会,突然感觉408和数据库的重要性),来进行数据库的查询。其实这个Python代码感觉挺有用的,但是代码看的似懂非懂)