Flask接口签名sign原理与实例代码浅析
395
2022-10-03
Java代码审计之JDBC中的sql注入(jdbc sql注入)
Java代码审计系列课程
sql注入
漏&洞原理:
在常见的web漏&洞中,SQL注入漏&洞较为常见,危害也较大。攻&击者一旦利用系统中存在的SQL注入漏&洞来发起攻击,在条件允许的情况下,不仅可以获取整站数据,还可通过进一步的渗透来获取服务器权限,从而进入内网。 注入攻击的本质,是把用户输入的数据当做代码执行。这里有两个关键条件,第一个是用户能够控制输入;第二个是原本程序要执行的代码,拼接了用户输入的数据。接下来说下SQL注入漏洞的原理。 举个栗子。
当用户发送GET请求:title,content FROM news WHERE id = 1
这是SQL的原义,也是程序员想要得到的结果,但是如果用户改变了id的内容,修改成如下:
and 1=2 UNION SELECT userna-me, password FROM admin
此时内部程序执行的SQL语句为:
SELECT title,content FROM news WHERE id = 1 and 1=2 UNION SELECT username, password FROM admin
这条SQL的原义就会被改变,导致将管理员数据表中的用户名显示在页面title位置,密码显示在页面content位置,攻击成功。
jdbc
在上古时期,人们往往这么从数据库获取数据。
public User getUserById(String id) throws SQLException { Connection connection = JDBCTOOLS.getConnection(); String sql = "select id,username from user where id=" + id; Statement statement = connection.createStatement(); ResultSet resultSet = statement.executeQuery(sql); resultSet.next(); int userId = resultSet.getInt(1); String username = resultSet.getString(2); User user = new User(userId, username); return user;}
通过拼接字符串来构建sql语句,其中又有用户可控的部分,很容易出现问题。
直接拼接实例代码
sql = "select * from user where username like '%?%'";
这种写法是无法进行预编译的,程序会报错。 like预处理报错
by
需要按照时间、id等信息进行排序的时候,也是无法使用预编译的。
String sort = req.getParameter("sort");String sql = "select * from user order by ?";PreparedStatement preparedStatement = connection.prepareStatement(sql); //预编译preparedStatement.setString(1, sort); //绑定参数ResultSet resultSet = preparedStatement.executeQuery();
如果像上面这样强行使用预编译,数据库会将字段名解析为字符串,即实际执行的sql为
select * from user order by 'username';
无法达到实际需求。
总结:jdbc方式进行拼接的,可以直接使用预处理来规避sql注入,但是如果有like、order by 进行参数拼接不能直接使用预处理来解决,必须在set处把%拼接上。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~