第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定

Java代碼審計(jì)之JDBC中的sql注入

sql注入

漏洞原理

在常见的web漏洞中,SQL注入漏洞较为常见,危害也较大。攻击者一旦利用系统中存在的SQL注入漏洞来发起攻击,在条件允许的情况下,不仅可以获取整站数据,还可通过进一步的渗透来获取服务器权限,从而进入内网。

注入攻击的本质,是把用户输入的数据当做代码执行。这里有两个关键条件,第一个是用户能够控制输入;第二个是原本程序要执行的代码,拼接了用户输入的数据。接下来说下SQL注入漏洞的原理。

举个栗子。

当用户发送GET请求:
http://www.xxx.com/news.jsp?id=1

这是一个新闻详情页面,会显示出新闻的title和content,程序内部会接收这个id参数传递给SQL语句,SQL如下:

SELECT title,content FROM news WHERE id = 1

这是SQL的原义,也是程序员想要得到的结果,但是如果用户改变了id的内容,修改成如下:

http://www.jd.com/news.jsp?id=1 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语句,其中又有用户可控的部分,很容易出现问题。

直接拼接实例代码

http://localhost:8080/sqli/jdbc/vul?username=joychou

预编译处理后的代码(修复后代码)

http://localhost:8080/sqli/jdbc/sec?username=joychou

后来,出现了预编译机制,但是预编译只能处理查询参数,很多场景下仅仅使用预编译是不够的。

  • like

    like拼接实现代码:

    http://localhost:8080/sqli/jdbc/like?username=joy

    在使用模糊查询的场景中,

    String sql = "select * from user where username like '%?%'";

    这种写法是无法进行预编译的,程序会报错。

    like预处理报错

    http://localhost:8080/sqli/jdbc/likesec?username=joy

    https://img4.sycdn.imooc.com/6218e3280001ed7618830814.jpg

like预处理

http://localhost:8080/sqli/jdbc/likesec?username=joy

https://img2.sycdn.imooc.com/6218e329000178da17680661.jpg

  • order 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处把%拼接上。




點(diǎn)擊查看更多內(nèi)容
TA 點(diǎn)贊

若覺(jué)得本文不錯(cuò),就分享一下吧!

評(píng)論

作者其他優(yōu)質(zhì)文章

正在加載中
  • 推薦
  • 評(píng)論
  • 收藏
  • 共同學(xué)習(xí),寫下你的評(píng)論
感謝您的支持,我會(huì)繼續(xù)努力的~
掃碼打賞,你說(shuō)多少就多少
贊賞金額會(huì)直接到老師賬戶
支付方式
打開微信掃一掃,即可進(jìn)行掃碼打賞哦
今天注冊(cè)有機(jī)會(huì)得

100積分直接送

付費(fèi)專欄免費(fèi)學(xué)

大額優(yōu)惠券免費(fèi)領(lǐng)

立即參與 放棄機(jī)會(huì)
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)

舉報(bào)

0/150
提交
取消