本文為一些列連載文章之一,不定期更新,計劃目錄如下:
OWASP介紹
SQL注入
命令注入
XML外部實體注入
XPATH注入
反射式、DOM及存儲XSS
失效的身份認證和會話管理
不安全的直接對象引用
安全配置錯誤
敏感信息泄露
功能級訪問控制缺失
跨站請求偽造
服務端請求偽造
文件上傳漏洞
未驗證的重定向和轉發
不安全的反序列化
使用含有已知漏洞的組件
一、?????注入
注入攻擊漏洞,例如SQL,OS 以及 LDAP注入。這些攻擊發生在當不可信的數據作為命令或 者查詢語句的一部分,被發送給解釋器的時候。攻擊者發送的惡意數據可以欺騙解釋器,以執行計劃外的命令或者在未被恰當授權時訪問數據。
SQL注入
漏洞利用演示

漏洞危害說明
SQL注入攻擊成功后,可導致用戶數據庫中存儲的機密數據被竊取,更改,刪除,或者上傳木馬文件,甚至執行系統命令以進一步獲取服務器權限等。
漏洞代碼分析
處理用戶登錄的后臺代碼主要如下:(左右滑動查看代碼)
publicbooleancheck_Sql_Login(String ipaddr) throws Exception { getConnection(); String name = loginuser.getName(); String passwd_page = loginuser.getPassword(); boolean flag = false; // 默認返回值是false Md5Util md5 = new Md5Util(); String passwd =md5.getMD5(passwd_page.getBytes()); // 拼湊的SQL語句,存在注入風險 String sql = "selectname from user where name=" + "'" + name + "'" + " andpassword=" + "'" + passwd + "'"; System.out.println("登錄頁面,拼湊SQL語句: " + sql); try { java.sql.Statement st = conn.createStatement(); rs =st.executeQuery(sql); if (rs.next()) { flag = true; } else { flag = false; } st.close(); System.out.println("登錄頁面查詢結果" + "db.java.check_Sql_Login():" + flag); } catch (Exceptione) { e.printStackTrace(); } finally { out.close(); conn.close(); } return flag; }
如果用戶名tmp已經存在,輸入tmp‘#即可。
如果用戶名不存在,繼續構建條件為true的語句,如xxx’ or 1=1or ‘1’=’1。
調試輸出分別如下:
登錄頁面,拼湊SQL語句1: select name from user where name='tmp'#' andpassword='d41d8cd98f00b204e9800998ecf8427e'
登錄頁面查詢結果db.java.check_Sql_Login(): true
登錄頁面,拼湊SQL語句1: select name from user where name='xxxxx' or1=1 or '1'='1' and password='d41d8cd98f00b204e9800998ecf8427e'
登錄頁面查詢結果db.java.check_Sql_Login(): true
漏洞代碼修復
防止SQL注入可使用:(左右滑動查看代碼)
? ? ?a.推薦使用預編譯語句,通過prepared Statements類的set方法對參數進行檢測;??
publicbooleancheck_Presql_Login() throws Exception { getConnection(); String name = loginuser.getName(); String passwd = loginuser.getPassword(); boolean flag = false; //定義執行的SQL代碼 //區分data和code String sql = "select* from user where name=" + "?" + " andpassword=" + "?"; pst = conn.prepareStatement(sql); pst.setString(1,name); Md5Util md5 = new Md5Util(); passwd = md5.getMD5(passwd.getBytes()); pst.setString(2,passwd); System.out.println("登錄頁面,預編譯SQL語句: " + sql); rs = pst.executeQuery(); if (rs.next()) { flag = true; } else { flag = false; }rs.close();System.out.println("登錄頁面查詢結果" + "db.java.check_Presql_Login():" + flag);return flag;}
? ? ?b.使用ESAPI提供的方法;(左右滑動查看代碼)
publicbooleancheck_EsapiSql_Login() throws Exception { getConnection(); String name = loginuser.getName(); String passwd = loginuser.getPassword(); boolean flag = false; // 默認返回值是false Md5Util md5 = new Md5Util(); passwd = md5.getMD5(passwd.getBytes()); Codec mysqlCodec = newMySQLCodec(MySQLCodec.MYSQL_MODE); String esapi_name = ESAPI.encoder().encodeForSQL(mysqlCodec,name); String esapi_passwd = ESAPI.encoder().encodeForSQL(mysqlCodec,passwd); // 拼湊的SQL語句,存在注入風險 String sql = "selectname from user where name=" + "'" +esapi_name + "'" + " andpassword=" + "'" + esapi_passwd+ "'"; try { java.sql.Statement st = conn.createStatement(); rs =st.executeQuery(sql); if (rs.next()) { flag = true; } else { flag = false; } st.close(); System.out.println("登錄頁面查詢結果" + "db.java.check_Sql_Login():" + flag); } catch (Exceptione) { e.printStackTrace(); } finally { out.close(); conn.close(); } return flag;????}
c.自定義過濾方法;??
1)?自定義過濾方法(左右滑動查看代碼)
protectedstaticboolean sqlValidate(String str) { str = str.toLowerCase();//統一轉為小寫 String badStr = "'|and|exec|execute|insert|select|delete|update|count|drop|*|%|chr|mid|master|truncate|" + "char|declare|sitename|netuser|xp_cmdshell|;|or|-|+|,|like'|and|exec|execute|insert|create|drop|" + "table|from|grant|use|group_concat|column_name|" + "information_schema.columns|table_schema|union|where|select|delete|update|order|by|count|*|" + "chr|mid|master|truncate|char|declare|or|;|-|--|+|,|like|//|/|%|#";//過濾掉的sql關鍵字,可以手動添加 String[] badStrs = badStr_miss.split("\\|"); for (int i = 0; i< badStrs.length; i++) { if(str.indexOf(badStrs[i]) >= 0) { System.out.println("發現非法字符:"+badStrs[i]); returntrue; } } returnfalse;}
2)對用戶輸入進行過濾??(左右滑動查看代碼)
publicboolean check_ValidSql_Login() throws Exception { getConnection(); String name = loginuser.getName(); String passwd = loginuser.getPassword(); boolean flag = false; // 默認返回值是false Md5Util md5 = new Md5Util(); passwd = md5.getMD5(passwd.getBytes()); // 拼湊的SQL語句,存在注入風險 String sql = "selectname from user where name=" + "'" + name + "'" + " andpassword=" + "'" + passwd + "'"; if (sqlValidate(name)){ System.out.println("登錄頁面,拼湊SQL語句: " + sql); } else { try { java.sql.Statement st = conn.createStatement(); rs = st.executeQuery(sql); if (rs.next()) { flag = true; } else { flag = false; } st.close(); System.out.println("登錄頁面查詢結果" + "db.java.check_Sql_Login():" + flag); } catch (Exceptione) { e.printStackTrace(); } finally { out.close(); conn.close(); } } return flag;}
作者:王愛華 新鈦云服安全架構師
二十年IT行業安全咨詢、安全技術和安全管理經驗,擁有安全行業CISSP、CISA認證,曾任浦東中軟、絡安、盛大網絡、平安付、滬江網等公司安全咨詢顧問、安全經理、高級安全研究員、安全架構師職位。處理過互聯網公司各類安全問題,包括信息基礎架構安全,應用架構和代碼安全,應用運維安全,數據安全和災難恢復等。
熟悉ISO17799、等級保護、PCI-DSS、SOX等信息安全標準規范,具有支付牌照、等級保護、PCI認證的申請、實施和年審經驗。熟悉Shell、Python、Java等語言,曾負責搭建metron開源大數據平臺,單獨開發OWASP TOP 10安全演示平臺和企業信息安全管理平臺等。
了解新鈦云服
新鈦云服正式獲批工信部ISP/IDC(含互聯網資源協作)牌照
深耕專業,矗立鰲頭,新鈦云服獲千萬Pre-A輪融資
原電訊盈科中國區副總裁加入新鈦云服「附專訪」
新鈦云服,打造最專業的Cloud?MSP+,做企業業務和云之間的橋梁
新鈦云服一周年,完成兩輪融資,服務五十多家客戶
上海某倉儲物流電子商務公司混合云解決方案
新鈦云服出品的部分精品技術干貨
OWASP Top 10安全風險實踐(一)
七個用于Docker和Kubernetes防護的安全工具
運維人的終身成長,從清單管理開始|萬字長文!
99%運維不知道,系統文件md5變了,竟然是因為......
OpenStack與ZStack深度對比:架構、部署、計算存儲與網絡、運維監控等
什么是云原生?
IT混合云戰略:是什么、為什么,如何構建?