最近一直忙著實(shí)習(xí)面試,在準(zhǔn)備面試的過程確實(shí)也補(bǔ)充了很多自己以前的知識(shí)盲區(qū),雖然有點(diǎn)考前惡補(bǔ)的意思档押,但能學(xué)到知識(shí)總歸是好的。當(dāng)然曙寡,面試的結(jié)果也還算滿意,雖然還沒有拿到自己心中T0的大廠offer寇荧,但也獲得了很多其他乙方包括某個(gè)大廠甲方的實(shí)習(xí)offer举庶。師哥們也陸續(xù)去實(shí)習(xí)了,老師這邊壓著比較多的項(xiàng)目正在推進(jìn)揩抡,大都是滲透方向的户侥,包括這個(gè)月的業(yè)務(wù),所以趁著實(shí)習(xí)面試的尾聲峦嗤,好好的干一波嘿嘿蕊唐。
一、Result
這個(gè)月的業(yè)務(wù)挖洞成果對(duì)自己來說還是很滿意的烁设,除了漏洞數(shù)量外替梨,漏洞質(zhì)量也比較高。具體就不多說了装黑,言歸正傳副瀑,在本月的業(yè)務(wù)滲透測(cè)試?yán)锇l(fā)現(xiàn)一個(gè)很有趣的sql注入,也是自己之前的一個(gè)盲區(qū)——order by排序注入恋谭,一直想著在實(shí)戰(zhàn)中接觸這種類型的注入場景糠睡,還真就來了。
二疚颊、Process
話不多說狈孔,上接口:
https://xxxx.com/xxx/xxx/xxx/getAreaSpotPageList?&pageindex=1&pagesize=20&passAreaId=2&orderby=pass_area_spot_id+desc&userId=1181163&hotelId=5&brandId=5
這是一個(gè)比較正常的get類型的獲取數(shù)據(jù)接口信认,但orderby參數(shù)比較惹眼,因?yàn)閰?shù)的值為pass_area_spot_id+desc均抽,desc表示的是sql中的降序排序嫁赏,卻以orderby參數(shù)值的方式輸入,所以就對(duì)該參數(shù)進(jìn)行了測(cè)試:
Step 1:
令orderby=pass_area_spot_id+desc到忽,返回?cái)?shù)據(jù)如下:
Step 2:
令orderby=pass_area_spot_id+asc,返回?cái)?shù)據(jù)如下:
(解釋一下清寇,兩種情況下返回內(nèi)容不一致)
Step 3:
這里其實(shí)大致可以判斷存在排序注入的可能喘漏,但還是有歧義,需要進(jìn)一步進(jìn)行判斷华烟,這里采用基于時(shí)間的盲注輔助判斷:
Payload1:pass_area_spot_id+desc,(select*from(select+sleep(3)union/**/select+1)a)
返回如下:
該請(qǐng)求在5s多時(shí)得到響應(yīng)翩迈。
Payload2:pass_area_spot_id+desc,(select*from(select+sleep(6)union/**/select+1)a)
返回如下:
該請(qǐng)求在8s多時(shí)得到響應(yīng)。
在不考慮測(cè)試環(huán)境本身的網(wǎng)絡(luò)狀況盔夜,上述測(cè)試過程可以證明漏洞的存在负饲。
Step 4:
Time-based還是不太方便,并且時(shí)間較長喂链。所以更換注入手法返十,直觀輸出注入結(jié)果:
Payload:pass_area_spot_id+desc,if(ascii(substr(database(),? ,1))=?,1,(select%201%20from%20information_schema.tables))
通過布爾類型的盲注,利用上述payload進(jìn)行fuzz(省略通過二分法判斷當(dāng)前數(shù)據(jù)庫長度的步驟):
查找對(duì)應(yīng)ascii所代表的字符椭微,獲得當(dāng)前數(shù)據(jù)庫名:xxxxxxxx洞坑,測(cè)試結(jié)束。
三蝇率、Review
在整個(gè)測(cè)試階段里迟杂,雖然注入成功,但是也引發(fā)了自己的兩個(gè)問題本慕,這兩個(gè)問題也是自己在面試的過程中所碰到的排拷。
Q1、為什么預(yù)編譯不太好防order by注入(就mysql數(shù)據(jù)庫來談)锅尘?
A1:
這個(gè)問題不管在面試的過程中還是個(gè)人的平時(shí)積累過程中都能夠折射出個(gè)人的學(xué)習(xí)深度监氢,很遺憾,我并沒有在面試的過程中很好的回答這個(gè)問題藤违,其實(shí)并不是不知道這個(gè)問題的答案忙菠,而是不太好組織語言去系統(tǒng)性的帶擴(kuò)展的回答它,并且在之前的挖洞經(jīng)歷里沒有對(duì)應(yīng)的場景支撐纺弊,所以還是比較遺憾吧牛欢,另一方面更說明自己的知識(shí)體系太弱,表面徘徊較多淆游。
言歸正傳傍睹,為什么預(yù)編譯不太好防order by注入隔盛?這個(gè)問題等于是在問為什么在預(yù)編譯中order by后不能參數(shù)化?一般的sql執(zhí)行片段代碼(預(yù)編譯方式)是這樣的:
Connection conn = DBConnect.getConnection();
String sql = " SELECT xxx FROM xxx WHERE xxx = ? ";
ps = conn.prepareStatement(sql);
ps.setString(1, xxx); //或者ps.setInt(1, username);
rs = ps.executeQuery();
當(dāng)我們輸入xxx=abc時(shí)拾稳,預(yù)編譯的代碼會(huì)自動(dòng)給abc加上引號(hào),變成'abc'吮炕,sql語句也變成了:
String sql = " SELECT xxx FROM xxx WHERE xxx = 'abc' ";
這樣可以有效的防止用戶的輸入直接拼接在sql語句之后,譬如用戶輸入xxx=' or '1'='1時(shí)访得,實(shí)際上的sql語句卻為:
String sql = " SELECT xxx FROM xxx WHERE xxx = '' or '1'='1' ";
無法達(dá)到攻擊的效果龙亲。說回order by,order by的用法一般為order by [字段名] [desc/asc]悍抑,如果對(duì)order by之后的輸入進(jìn)行參數(shù)化鳄炉,那么sql語句將會(huì)變成這樣:
String sql = " SELECT xxx FROM xxx WHERE xxx ='xxx' order by 'xxx' "
這樣會(huì)造成sql語法錯(cuò)誤,因?yàn)榇藭r(shí)'xxx'是字符串而不是字段名搜骡。
那么為什么預(yù)編譯的函數(shù)在參數(shù)化時(shí)非要把輸入加上引號(hào)呢拂盯?如果沒有引號(hào)不就可以防御order by注入了嗎?是的记靡,但確實(shí)沒有不加引號(hào)的預(yù)編譯的方法哈哈谈竿。
引伸來說,這樣的sql注入不僅僅發(fā)生在order by處摸吠,任何需要字符串且不能夠加引號(hào)的地方都有可能發(fā)生類似的注入空凸,因?yàn)椴荒軈?shù)化的位置,不管怎么拼接寸痢,最終都是和使用“+”號(hào)拼接字符串的功效一樣劫恒。
那么又引出了新的問題,既然預(yù)編譯防不了order by轿腺,那么該怎么樣防两嘴?答案是采用白名單的方式,因?yàn)閛rder by之后跟的字段名肯定是有限的并且是數(shù)據(jù)庫中已經(jīng)存在的字段族壳,只要對(duì)這些有限字段設(shè)置白名單憔辫,任何不在白名單內(nèi)的數(shù)據(jù)統(tǒng)一報(bào)錯(cuò),那么就可以解決啦仿荆。
Q2贰您、面對(duì)時(shí)間較長的Time-based或者Boolean-Base,除了用工具自動(dòng)化跑結(jié)果外拢操,有沒有其他較好的方式锦亦?
A2
答案是利用Dnslog,當(dāng)時(shí)面試的時(shí)候比較緊張令境,一直想著payload的改進(jìn)和工具自動(dòng)化杠园,把這個(gè)給忘了,其實(shí)也跟平時(shí)使用這個(gè)技巧不多的原因有關(guān)舔庶,所以認(rèn)了抛蚁。陈醒。不過在面試過后確實(shí)對(duì)Dnslog又強(qiáng)化了一波,的確很好用瞧甩。直接上鏈接把->Dnslog-<钉跷,這個(gè)博主關(guān)于Dnslog在各個(gè)場景下的使用技巧總結(jié)的十分詳細(xì)了。
四肚逸、Re-review
參與面試的過程其實(shí)是對(duì)自己之前所積累的技術(shù)體系的一種測(cè)試爷辙,更重要的對(duì)我來說收獲最多是了解圈內(nèi)的大牛們都在關(guān)注著哪些他們感興趣的方向和技術(shù)細(xì)節(jié),在丟人的同時(shí)的確獲得了很多自己想要的信息哈哈朦促。也發(fā)現(xiàn)了自己在hack的過程中深度的確不夠膝晾,容易滿足于眼前的成果,挖洞是一方面思灰,學(xué)習(xí)知識(shí)也是玷犹。因?yàn)閔ack的過程永遠(yuǎn)比挖到漏洞更重要混滔。
五洒疚、To-Do
1、接下來的時(shí)間里繼續(xù)靶場的練習(xí)坯屿,回顧之前浮躁?duì)顟B(tài)下所忽略的技術(shù)細(xì)節(jié)油湖,直到hack清楚為止。
2领跛、思考自己的知識(shí)框架和技術(shù)框架乏德,乘早跳出滲透的圈子,接觸真正的企業(yè)體系安全建設(shè)吠昭。
3喊括、培養(yǎng)好奇心,保持好奇心矢棚。