【Java安全】---JWT安全及預編譯CASE注入---day40
一、思維導圖
二、SQL Injection
1、防御sql注入,其實就是session,參數綁定,存儲過程這樣的注入。
//利用session防御,session內容正常情況下是用戶無法修改的:
select * from users where user = "'" + session.getAttribute("UserID") + "'";
//參數綁定方式,利用了sql的預編譯技術
預編譯講解:https://www.cnblogs.com/klyjb/p/11473857.html
String query = "SELECT * FROM users WHERE last_name = ?";
PreparedStatement statement = connection.prepareStatement(query);
statement.setString(1,accountNmae);
ResultSet results = statement.executeQuery();
上面說的方式也不是能夠絕對的進行SQL注入防御,只是減輕。
比如參數綁定的方式可以使用下面的方式繞過:
通過使用case when語句可以將order by后的orderExpression表達式中添加select語句。
案例:WEBGOAT sql注入
在參數ip可以操作,可以去查看源碼有oder by 查詢,然后是通過預編譯的方法
抓包
隨便輸入一個,報錯,爆出了sql語句
在過關技巧那里,有case when的繞過方法。
https://blog.csdn.net/u013553529/article/details/82765062
目的學習就是通過oder by 解決預編譯注入。
三、JWT安全
1、結構
頭 聲明 簽名
流程:
2、Javaweb-身份驗證攻擊-JWT修改偽造攻擊
在webgoat里
目的是使用普通用戶的token,變為管理員。
點一下右上角的users,選擇Tom。抓包
然后點擊重新設置Tom
就出現了access_token,這就是JWT的類型格式。使用在線解密:
JWT.IO:
https://jwt.io/
后面的簽名,必須要密匙才能知道是啥。我們把上面的admin:false改為true就可以了。
把修改后的JWT復制過去替換就可以了。但是發現會報錯,就是因為使用了加密算法,需要簽名的密匙的原因。
我們只需要把第一部分算法改為none,然后拼接起來,復制過去應該就可以了。
由於base64加密后有等於號,我們需要把等於號去掉。
3、Javaweb-身份驗證攻擊-JWT密匙爆破攻擊
進行解密:
腳本:
用到了fuzz字典。找到了密匙
4、Javaweb-jwt偽造冒充
購物以其他用戶購買,日志分析某用戶的jwt數據,進行修改偽造提交。
點擊退房,抓包。
補充jwt的交互原理:
然后在題目那里,給了一個日志。查看一下。
有個jwt_token。分析一下
用戶是Tom。由於我們不知道密匙,所以還是修改alg為none進行偽造,並且修改失效的時間戳。
放到Authorization中:
5、JWT-最終挑戰
點擊Tom下面的刪除,抓包:
解密一下Token
在源碼中有SQL語句
也就是說上面的kid是從jwt的頭部得到的。那么更改kid就可以形成注入。
6、Javaweb-身份驗證攻擊-JWT安全結合SQL注入
https://www.freebuf.com/vuls/216457.html
7、CTF-Node.js-前端jwt登錄安全-偽造admin實現getflag
#結題思路:
注冊用戶登錄-分析/controllers/api.js-用戶admin可獲取flag
抓取登錄數據包,進行反解密修改再加密,偽造登錄獲取flag。
靶場:CTFHUB
注冊個賬號密碼
完事之后,在登錄頁面抓包:
登陸之后點擊,獲取flag,顯示權限被拒絕。
說明就是要我們通過jwt改身份唄。
在下面的地址里可以查看源代碼:
注意這個函數:
還是把alg改為none,拼接形成payload。
然后此時再點獲取flag。
得到flag。