第一天
在一次授權(quán)的攻防項(xiàng)目中,我和我的一個(gè)好兄弟在滲透過(guò)程中發(fā)現(xiàn)一個(gè)目標(biāo)存在mssql注入,通過(guò)注入拿到了管理員的賬號(hào)和密碼。
當(dāng)時(shí)我和我的好兄弟高興壞了,迫不及待的把拿到的數(shù)據(jù)進(jìn)行解密(當(dāng)時(shí)天真認(rèn)為可以解密,馬上getshell)由于是攻防演練,并且報(bào)告提交的越早分?jǐn)?shù)就會(huì)越高,何況還是getshell。
結(jié)果發(fā)現(xiàn)根本解不出,后來(lái)發(fā)現(xiàn)原來(lái)是加鹽MD5,想著先把鹽值找到或許就能有一線突破,最終找到的鹽值和賬號(hào)對(duì)應(yīng)如下:
當(dāng)時(shí)我和我兄弟在這里卡了半天,甚至是去網(wǎng)上搜索加鹽md5的破解,后面發(fā)現(xiàn)根本解不出來(lái)。
第二天
我和兄弟那一晚上一夜未眠,想著各種法子去解密,網(wǎng)上各種辦法,各種腳本都試了一遍,發(fā)現(xiàn)完全不行,突然一下有個(gè)念頭一下子出來(lái)了,在上一次的攻防演練中,也是mssql注入,當(dāng)時(shí)可以通過(guò)堆疊注入,自己插入一條數(shù)據(jù),于是我們開(kāi)始整理思路思路如下:
思路一
通過(guò)堆疊注入插入一條數(shù)據(jù),直接登錄(但是要自己找到一條加鹽Md5)搭建這個(gè)cms搭建起來(lái),自己創(chuàng)建一個(gè)管理員賬號(hào),然后插入進(jìn)去。
思路二
找到對(duì)應(yīng)的cms或者是網(wǎng)站源碼,代碼審計(jì),試圖找到加密流程或者是其他有用信息。
嘗試思路
通過(guò)mssql注入的報(bào)錯(cuò)信息可以判斷出為dtcms,于是我迫不及待的去github搜羅了一番,找到了其源碼,首先想到的搭建起來(lái)這個(gè)cms,由于對(duì)net環(huán)境的不熟悉,加上搭建后各種報(bào)錯(cuò),(讓我抑郁了很久)繼續(xù)信息收集,發(fā)現(xiàn)源代碼下面有個(gè)SQL文件,進(jìn)去搜索找到一條加密的數(shù)據(jù),并且前期信息收集到dtcms的默認(rèn)密碼是admin888于是開(kāi)始行動(dòng)全局搜索salt。
插入payload如下:
插入的賬號(hào)為test 密碼是admin888
登錄賬號(hào)
登錄成功發(fā)現(xiàn),權(quán)限為超級(jí)管理員,然后getshell(在某篇文章看到)文件上傳類(lèi)型添加aspx,ashx,然后上傳相應(yīng)的哥斯拉馬,直連即可。
最后我和我兄弟成功將這個(gè)站點(diǎn)拿下但是內(nèi)心感覺(jué)還是空空的,先提交報(bào)告吧。
第三天
我和兄弟越想越不舒服,我們思路二還沒(méi)試過(guò)呢,如果我們可以解密這個(gè)加密數(shù)據(jù),是不是以后遇到類(lèi)似的站點(diǎn),假如不存在堆疊注入,豈不是不能插入數(shù)據(jù),不行,必須得試一下,于是開(kāi)始代碼審計(jì)。
.net基本知識(shí)
.ashx一般是網(wǎng)頁(yè)文件。.cs文件一般是后臺(tái)邏輯代碼。
目前已有的數(shù)據(jù)
代碼審計(jì)
在DTcms.Web中找到login.aspx.cs。
通過(guò)調(diào)用manager類(lèi)中的GetModel方法來(lái)判斷是否登錄成功。
ps:這里BLL.manager()中BLL是一個(gè)命名空間。我們可以通過(guò)BLL這個(gè)名字在DTcms.BLL文件夾中找到manager.cs。
接著在manager類(lèi)中的GetModel方法中,發(fā)現(xiàn)在登錄的時(shí)候會(huì)先從數(shù)據(jù)庫(kù)中獲得這個(gè)用戶的鹽值,然后根據(jù)輸入的密碼與鹽值調(diào)用DESEncrypt.Encrypt(password, salt)進(jìn)行加密。后來(lái)知道了這里DESEncrypt是一個(gè)類(lèi),Encrypt是一個(gè)靜態(tài)函數(shù),所以可以直接調(diào)用。
接著我們審計(jì)DESEncrypt中的Encrypt方法。在文件夾中搜索DESEncrypt,最終在DTcms.Common中找到了DESEncrypt類(lèi)。加解密流程邏輯代碼不需要細(xì)看,只需要知道就是傳入密文和鹽值調(diào)用Decrypt函數(shù)即可得到明文。
源碼如下
最終得到明文
總結(jié)
通過(guò)這次攻防再一次加深了代碼審計(jì)的重要性,有時(shí)候就是一個(gè)突破點(diǎn),還有就是和兄弟在審計(jì)中遇到的困難,一次次被突破,那種感覺(jué)真的很爽?。?/p>