精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

顫抖了嗎?九步逆向破解銀行安全令牌

安全 黑客攻防
作者歷經(jīng)千辛萬(wàn)苦,逆向了一個(gè)銀行動(dòng)態(tài)口令的APP,過(guò)程艱辛曲折。最后發(fā)現(xiàn),其實(shí)生成算法也不算很復(fù)雜,其中主要使用了 android_id 系統(tǒng)時(shí)間戳 作為生成變量。看起來(lái)高大上的動(dòng)態(tài)口令,在逆向工程師抽絲剝繭的分析下,亦不過(guò)如此哇~

作者歷經(jīng)千辛萬(wàn)苦,逆向了一個(gè)銀行動(dòng)態(tài)口令的APP,過(guò)程艱辛曲折。最后發(fā)現(xiàn),其實(shí)生成算法也不算很復(fù)雜,其中主要使用了 android_id 系統(tǒng)時(shí)間戳 作為生成變量??雌饋?lái)高大上的動(dòng)態(tài)口令,在逆向工程師抽絲剝繭的分析下,亦不過(guò)如此哇~

正文

我這次要對(duì)全巴西最大的銀行之一開(kāi)刀,我也經(jīng)常會(huì)使用到這家銀行所提供的服務(wù)。他使用包括用戶(hù)密碼在內(nèi)的多種途徑來(lái)驗(yàn)證用戶(hù)的身份。我逆向的動(dòng)態(tài)口令(OPT)也是其中一種,并且我把他移植到了Arduino-compatible 平臺(tái)上。

免責(zé)聲明和更多的免責(zé)聲明

在文章中我已經(jīng)去掉了敏感的信息,以保護(hù)無(wú)辜的人的利益。而且這項(xiàng)研究的結(jié)果也不足以讓我能夠黑掉別人的銀行賬戶(hù)。即使一個(gè)擁有root權(quán)限的第三方惡意應(yīng)用,在沒(méi)有足夠的賬戶(hù)信息的前提下,都不能模擬動(dòng)態(tài)口令的生成。而且,這次研究并沒(méi)有發(fā)現(xiàn)任何代碼層面的漏洞,這家銀行的生成算法甚至比google的認(rèn)證算法還要安全,甚至可以說(shuō)這篇文章是對(duì)該銀行APP安全性的一次褒獎(jiǎng)。他的動(dòng)態(tài)生成算法,完全符合TOTP規(guī)范。把數(shù)據(jù)安全做到了極致。

下面就是免責(zé)聲明 balabala一大堆,請(qǐng)?jiān)徯【幘筒环g了,想看的可以去原文地址觀看

顫抖了嗎?九步逆向破解銀行安全令牌

通常對(duì)于新用戶(hù),他們會(huì)得到一張密保卡,但是密??ㄟ@東西是極其不方便的。另外一個(gè)更好的方法就是使用android app生成一個(gè)動(dòng)態(tài)口令,大膽的猜測(cè),這個(gè)口令的生成可能把手機(jī)號(hào),或者是pin值作為參數(shù)。在我每次刷機(jī),或者更換手機(jī)的時(shí)候,都要重新綁定一遍這個(gè)安全服務(wù)。雖然過(guò)程比較簡(jiǎn)單,但還是令我不爽。所以我決定,逆向這個(gè)android APP做一個(gè)自己的動(dòng)態(tài)密碼生成工具。

Activating the application 激活應(yīng)用

在閱讀源碼之前,我還是喜歡先把應(yīng)用下載下來(lái)看看他長(zhǎng)啥樣,下面是三個(gè)階段的截圖。

顫抖了嗎?九步逆向破解銀行安全令牌 

顫抖了嗎?九步逆向破解銀行安全令牌 

顫抖了嗎?九步逆向破解銀行安全令牌

第一張是安裝時(shí)的截圖,看一下他所需要的權(quán)限,這可不是開(kāi)發(fā)人員為何好玩才加上去的。他們其中有些甚至有可能影響到動(dòng)態(tài)口令的生成。第二張是激活界面,需要填四個(gè)數(shù)字,這四個(gè)數(shù)字只能通過(guò)給銀行打電話(huà)被告知。第三幅圖就是,成功激活后生成的動(dòng)態(tài)口令。

The toolset 工具相關(guān)

逆向android應(yīng)用需要用到的幾個(gè)小工具,在下面列出來(lái)了,其實(shí)就是網(wǎng)上常用的幾種工具。

Android SDK
提供adb這個(gè)強(qiáng)大的命令行工具,提取apk文件,和獲取手機(jī)信息全靠它。
dex2jar
這個(gè)工具可以吧dex轉(zhuǎn)換成jar包的形式
JD, JD-GUI
這個(gè)就是··java反編譯工具,直接出源碼
Eclipse
這個(gè)就不多說(shuō)了,地球人都知道。

Getting the APK file from the phone 第一步:取得APK文件

這個(gè)相當(dāng)簡(jiǎn)單的嘛~。可以直接在play里面下,也可以使用ADB在手機(jī)中把他抓出來(lái)。

查找包名

$ ./adb shell pm list packages | grep mybank
package:com.mybank

確定路徑

$ ./adb shell pm list packages | grep mybank
package:com.mybank

下載

$ ./adb pull /data/app/com.mybank-1.apk
2950 KB/s (15613144 bytes in 5.168s)

第二步:解壓縮APK文件

APK直接可以被解壓縮,其實(shí)他就是一個(gè)壓縮包文件,只是后綴不同。解壓縮以后的classes.dex文件中包含了java源代碼信息。

解壓縮

$ unzip com.mybank-1.apk
(file list omitted for brevity)

把dex轉(zhuǎn)換成jar文件

$ mv classes.dex com.mybank-1.dex
$ ./d2j-dex2jar.sh com.mybank-1.dex
dex2jar com.mybank-1.dex -> com.mybank-1-dex2jar.jar

第三步:瞅代碼

把jar包放進(jìn)JD—GUI里面,就可以看到源代碼了。

顫抖了嗎?九步逆向破解銀行安全令牌

很輕易的就可以發(fā)現(xiàn)幾個(gè)比較特殊的包,br.com.mybank.integrador.token, br.com.othercompany.token , com.mybank.varejo.token毫無(wú)疑問(wèn)核心代碼就在里面,只不過(guò)代碼應(yīng)該被混淆了。

第四步:通過(guò)異常字符串反混淆

代碼中經(jīng)常的許多字符串名都被混淆了(其實(shí)是加密了,不過(guò)加密的秘鑰在代碼中能找到~,作者說(shuō)是混淆就是混淆把~),這比較蛋疼。要知道,代碼中的字符串會(huì)對(duì)逆向起到很大的幫助。

public void trocaPINcomLogin(int paramInt, boolean paramBoolean, Perfil paramPerfil)
{
    if (paramPerfil == null)
        throw new IllegalArgumentException(a.a("1p5/eEf/sl3kbeUcP509qg=="));
    if (!this.jdField_a_of_type_U.jdField_a_of_type_JavaUtilHashtable.contains(paramPerfil))
        throw new RuntimeException(a.a("86jcmKgr/ZshQu9aGVbuGscy2nHW4UEWqudRoUXhImQ=") + a.a("7u8KqqwqUD3a7FM339fp6pRrxUtQrHDMyqvZ6A2MurQ="));
    if ((this.jdField_a_of_type_BrComOtherCompanyTokenParamsGerenciador.isPinObrigatorio()) && (!paramBoolean))
        throw new RuntimeException(a.a("aMsL/5kjkXKD4K1SvpTuuJZUS0U0fL19UT2GxjJ/QzQ="));
    Configuracao localConfiguracao = paramPerfil.getConfiguracao();
    if ((localConfiguracao.a().a()) && (paramPerfil != this.jdField_a_of_type_BrComOtherCompanyTokenPerfil))
        throw new RuntimeException(a.a("ASszutKFJW3iqDb7X/+vqAcYxTLXN2SJOIs0ne596Pu3ZoRxjiiscwhV6fT70efX"));
    localConfiguracao.a().a(paramInt);
    localConfiguracao.a().a(paramBoolean);
    this.jdField_a_of_type_U.a(paramPerfil);
    if (!paramPerfil.equals(this.jdField_a_of_type_BrComOtherCompanyTokenPerfil))
        a(paramPerfil);
}

不過(guò)幸運(yùn)的是,在拋出異常的語(yǔ)句中,我們可以找到一些蛛絲馬跡,我們通過(guò)觀察可以發(fā)現(xiàn),混淆字符串的函數(shù)是a.a。根據(jù)這些信息的提示,我們可以猜測(cè)a.a是一個(gè)解密有關(guān)的類(lèi)。順理成章,我們直接去a函數(shù)中分析解密所使用的代碼。

這是分析完a類(lèi)之后的一些額外收獲

p類(lèi)是一個(gè)base64解密的類(lèi)。
b類(lèi),實(shí)現(xiàn)了AES的功能。搜索這個(gè)類(lèi)之中的一些字符串,我發(fā)現(xiàn)它是網(wǎng)絡(luò)上的一個(gè)開(kāi)源實(shí)現(xiàn) Paulo Barreto's JAES中的內(nèi)容。
a類(lèi)中的private static byte[]是混淆所使用的秘鑰,可以通過(guò)一個(gè)簡(jiǎn)短的程序來(lái)反混淆。

不過(guò)不幸的是,a.a不單單是JAES的AES加密的包裝,其中也包含著自己實(shí)現(xiàn)的一些加密。

不過(guò)這都不是事兒,我還是把a(bǔ).a中的解密函數(shù)用python實(shí)現(xiàn)了。

def decodeExceptionString(str):
    aesKey = <data from previous step>
    xorKey = <data from decompiled method>
    blockSize = 16
   
    aes = AES(aesKey)
    stringBytes = Base64.decode(str)
    outputString = ""
   
    for blockStart in xrange(0, len(stringBytes), blockSize):
        encryptedBlock = stringBytes[blockStart:blockStart+blockSize]
        plaintextBlock = aes.decrypt(encryptedBlock)
        outputString += plaintextBlock ^ xorKey
        xorKey = encryptedBlock
   
    return outputString

簡(jiǎn)而言之,除了AES和混淆秘鑰,這個(gè)類(lèi)還實(shí)現(xiàn)了CBC(密碼段鏈接)。

試驗(yàn)一下上述代碼的功能

$ ./decode "ASszutKFJW3iqDb7X/+vqAcYxTLXN2SJOIs0ne596Pu3ZoRxjiiscwhV6fT70efX"
N?o é possível alterar PIN sem estar logado.

這段葡萄牙語(yǔ)的意思是,it is not possible to change PIN without being logged in。看來(lái)代碼運(yùn)行的還不錯(cuò)。

第五步:逆向核心代碼–隨機(jī)密碼生成過(guò)程

解決了,字符串混淆的問(wèn)題,接下來(lái)個(gè)就要弄清楚隨機(jī)密碼的生成過(guò)程了~找啊找啊找啊找~~~~找了好久,我終于發(fā)現(xiàn)了一個(gè)切入點(diǎn),br.com.othercompany.token.dispositivo.OTP這個(gè)類(lèi)。下面是它拋出的一些異常,反混淆之后我們可以看到原文。

public String calculate() throws TokenException {
    int i = (int)Math.max(Math.min((this.a.getConfiguracao().getAjusteTemporal() + Calendar.getInstance().getTime().getTime() - 1175385600000L) / 36000L, 2147483647L), -2147483648L);
    a();
    if (i < 0)
        throw new TokenException("Janela negativa"), i);
    int j = (0x3 & this.a.getConfiguracao().getAlgoritmos().a) >> 0;
    switch (j)
    {
    default:
        throw new TokenException("Algoritmo inválido:" + j, i);
    case 0:
        return a(i);
    case 1:
    }
    return o.a(this.a.getConfiguracao().getChave().a(20), i);
}

很容易讀懂,變量i是一個(gè)時(shí)間戳,從2007年4月11日到現(xiàn)在的秒數(shù)除以36,36就是每個(gè)動(dòng)態(tài)口令的存活時(shí)間。

至于為什么是2007年4月11日,我就不知道了,大概是程序員他老婆的生日 : )

他還引入了一個(gè)修正函數(shù)getAjusteTemporal(),為了解決各地區(qū)的時(shí)差問(wèn)題。上文代碼中的o.a函數(shù)是用于生成動(dòng)態(tài)密碼,他的兩個(gè)參數(shù)一個(gè)是剛才說(shuō)到的時(shí)間戳,還有一個(gè)是遺傳byte數(shù)組(應(yīng)該是一個(gè)密鑰)。

第六步:尋找密鑰

看一下,生成語(yǔ)句的這段調(diào)用,this.a.getConfiguracao().getChave().a(20) this.a 是一個(gè)Perfil (profile) 對(duì)象,getConfiguracao() 返回一個(gè)Configuracao (settings) 對(duì)象getChave()返回一個(gè)z類(lèi),a(int)返回一個(gè)byte數(shù)組,這個(gè)數(shù)組就是key。

z類(lèi)中的字符串,也經(jīng)過(guò)了混淆,但是比較簡(jiǎn)單,反混淆過(guò)程就不提了.查看一下c類(lèi)中的a(int)函數(shù),是返回一個(gè)byte數(shù)組,長(zhǎng)度截取到參數(shù)值。Perfil (profile) 對(duì)象反而是由PersistenciaDB類(lèi)創(chuàng)建的,這個(gè)類(lèi)中也包含了很多被混淆的字符串。

a = a.a("DwYyIlrWxIS9ruNMCKH/PQ==");
b = a.a("SceoTjidi0XqlgRUo9hcDw==");
c = a.a("yrYBlcp8nEfVKUT9WSqTqA==");
d = a.a("jUTzBfsP/AO/Kx/1+VQ3CQ==");
e = a.a("Y56SnU/pIKROPCLHu7oFuw==") + b + a.a("38oyp4eW3xqT3TaMfWZ5RA==") + "_id" + a.a("3Q+FCEVH2PxZ31ms4WHHwNB40EbmtWzHPhwoaB1nM7lGr+9zZzuVpx5iZ4YR+KUw") + c + a.a("bYYIl6LtqthcUCCFFb7JCRSC8zr5hKIFXe5JHFCCkZA=") + d + a.a("ENCtPBu4RtFta2XI1GsQag==") + a.a("ImPhDy43f+Nr4G5ofkZz+g==");

幸好a.a的機(jī)制我們前面研究過(guò),翻譯出的原文如下。

a = "token.db";
b = "perfis";
c = "nome";
d = "data";
e = "create table perfis (_id integer primary key autoincrement, nome text not null, data blob not null);";

竟然是一條,SQL語(yǔ)句,真是很有趣,原來(lái)它使用數(shù)據(jù)庫(kù)來(lái)存儲(chǔ)配置信息。其中還有一個(gè)文件名token.db,很可能是一個(gè)SQLite數(shù)據(jù)庫(kù)。緊接著通過(guò)研究PersistenciaDB類(lèi)中的 carregar(load)函數(shù),我們可以確定這一想法,他通過(guò)SQLiteDatabase類(lèi)來(lái)訪(fǎng)問(wèn)這個(gè)數(shù)據(jù)庫(kù)。

不過(guò)我接下來(lái)發(fā)現(xiàn)數(shù)據(jù)blob(binary large object)在carragar函數(shù)中被aa.a(和上文中的a.a不是一碼事)這個(gè)函數(shù)加密了,這個(gè)函數(shù)接收blob數(shù)據(jù),和一串16個(gè)字符的密鑰。

在研究aa.a這個(gè)函數(shù)之前。我們先研究一下解密Blob的密鑰,他作為carregar的一個(gè)參數(shù)傳遞進(jìn)來(lái)。由PersistenciaUtils這個(gè)類(lèi)產(chǎn)生。下面是這個(gè)類(lèi)的入口。

public class PersistenciaUtils {
  public static byte[] getChave(Context paramContext, byte[] paramArrayOfByte) {
    try {
      byte[] arrayOfByte = MessageDigest.getInstance("SHA-1").digest(getId(paramContext).getBytes());
      return arrayOfByte;
    } catch (NoSuchAlgorithmException localNoSuchAlgorithmException) {
    }
    return new byte[20];
  }
  public static String getId(Context paramContext) {
    String str = Settings.System.getString(paramContext.getContentResolver(), "android_id");
    if (str == null)
      str = "<their default id>";
    return str;
  }
}

從代碼可以看出,先取得android_id的SHA-1摘要,如果獲取失敗就是用一個(gè)默認(rèn)的16進(jìn)制hash字符串。

使用adb看看我的android_id

$ ./adb shell
shell@hammerhead:/ $ content query --uri content://settings/secure --projection name:value --where "name='android_id'"
Row: 0 name=android_id, value=0123456789abcdef
shell@hammerhead:/ $ exit

a.aa把blob分成很多段,96位的頭,16位的隨機(jī)數(shù),16位的標(biāo)簽和為加密數(shù)據(jù)預(yù)留的空間。

進(jìn)一步研究aa這個(gè)類(lèi),我們的到了,如下的信息。

類(lèi)a實(shí)現(xiàn)了 EAX AEAD(Authenticated Encryption with Associated Data) 
類(lèi)f實(shí)現(xiàn)了 CMAC (Cipher-based Message Authentication Code)
類(lèi)h實(shí)現(xiàn)了 CTR (counter) mode  廣告計(jì)費(fèi)的功能
以上三個(gè)類(lèi)的算法實(shí)現(xiàn)都取自JAES庫(kù)
類(lèi)l實(shí)現(xiàn)了 SHA-1 哈希算法  ,有趣的是類(lèi)PersistenciaUtil并沒(méi)有使用它,而是使用了MessageDigest這個(gè)函數(shù)來(lái)替代它。
類(lèi)m實(shí)現(xiàn)了 HMAC (keyed-Hash Message Authentication Code) 算法
類(lèi)n,包裝了l和m,提供了HMAC-SHA1接口

最重要的我發(fā)現(xiàn),aa.a函數(shù)是通過(guò)CMAC標(biāo)簽進(jìn)行加密的,寫(xiě)出python的解密代碼。

def decodeBlob(datablob, android_id):
    header = datablob[:96]
    nonce = datablob[96:112]
    tag = datablob[112:128]
    cryptotext = datablob[128:]
    key1 = SHA1(android_id)[:16]
    aes = AES(key1)
    cmac = CMAC(aes)
    cmac.update(header)
    key2 = cmac.getTag()
    eax = EAX(key2, aes)
    (validTag, plaintext) = eax.checkAndDecrypt(cryptotext, tag)
    if validTag:
        return plaintext

如果EAX驗(yàn)證成功,aa.a返回解密的內(nèi)容給PersistenciaDB使用。

再來(lái)看PersistenciaDB這個(gè)類(lèi),其中的a方法可以解析明文數(shù)據(jù)并把它變成一個(gè)perfil對(duì)象,并反序列化之,把其變成一個(gè)包含著bool,short,byte的數(shù)組。

其中以下3個(gè),是關(guān)鍵的數(shù)據(jù),根據(jù)偏移量反推出偏移。

pin = int(blob[82:86])
key = blob[38:70]
timeOffset = long(blob[90:98])

這就是密鑰所需要的三個(gè)數(shù)據(jù),只要三個(gè)都正確,程序就可以正常運(yùn)行。

第七步:深度理解代碼

上文中得到的秘鑰在OPT 類(lèi)中被截取到20個(gè)字節(jié),并和時(shí)間戳一起傳送到o.a方法中,這個(gè)方法引用了上文提到的很多類(lèi),所以,比較輕松的就寫(xiě)出了python代碼~

def generateToken(key, timestamp):
    message = [0] * 8
    for i in xrange(7, 0, -1):
        message[i] = timestamp & 0xFF
        timestamp >>= 8
   
    hmacSha1 = HMAC_SHA1(key)
    hmacSha1.update(message)
    hash = hmacSha1.getHash()
   
    k = 0xF & hash[-1]
    m = ((0x7F & hash[k]) << 24 | (0xFF & hash[(k + 1)]) << 16 | (0xFF & hash[(k + 2)]) << 8 | 0xFF & hash[(k + 3)]) % 1000000;
    return "%06d" % m

基本時(shí)間戳是一個(gè)占8字節(jié)的長(zhǎng)整形,手動(dòng)把它轉(zhuǎn)換成大端的byte數(shù)組,接著使用HMAC-SHA1,取得hash最后四位作為整數(shù)讀取的索引。使用這個(gè)整形,mod 1000000,就是我們的隨機(jī)密碼了,簡(jiǎn)單的超乎我的想象~~

馬上我在google的TOTP認(rèn)證的實(shí)現(xiàn)代碼中,發(fā)現(xiàn)了很相似的一段。

public String generateResponseCode(byte[] challenge)
        throws GeneralSecurityException {
    byte[] hash = signer.sign(challenge);
    // Dynamically truncate the hash
    // OffsetBits are the low order bits of the last byte of the hash
    int offset = hash[hash.length - 1] & 0xF;
    // Grab a positive integer value starting at the given offset.
    int truncatedHash = hashToInt(hash, offset) & 0x7FFFFFFF;
    int pinValue = truncatedHash % (int) Math.pow(10, codeLength);
    return padOutput(pinValue);
}

其實(shí)他們使用了基本相同的算法。

第九步:克隆

現(xiàn)在一個(gè)德州出品的Stellaris LaunchPad正躺在我面前,我準(zhǔn)備了如下的庫(kù)~

Cryptosuite
 Arduino的加密算法庫(kù) (包括 SHA and HMAC-SHA)
RTClib
 JeeNodes and Arduinos所使用的輕量級(jí)時(shí)間日期庫(kù).
2x16LCD_library
A library for 2x16 LCD (like JDH162A or HD44780) written for Energia and Stellaris Launchpad (LM4F).

RTC有一部分需要改進(jìn)。由于Stellaris LaunchPad沒(méi)有板載實(shí)時(shí)時(shí)鐘,內(nèi)部時(shí)鐘需要在每次啟動(dòng)時(shí)設(shè)置,而且需要一臺(tái)電腦來(lái)輔助,這是很麻煩的事情。

完整代碼如下。

#include <sha1.h>
#include <LCD.h>
#include <RTClib.h>
RTC_Millis RTC;
void setup() {
    RTC.begin(DateTime(__DATE__, __TIME__)); 
   
    LCD.init(PE_3, PE_2, PE_1, PD_3, PD_2, PD_1);
    LCD.print("Token");
    LCD.print("valverde.me", 2, 1);
    delay(1000);
    LCD.clear();
}
char token[6];
uint8_t message[8];
long timestamp = 0;
long i = 0;
uint8_t key[] = {<your key here>};
void showToken() {
    long now = RTC.now().get() - 228700800 + 7200;
    i = now / 36;
    int timeLeft = now % 36;
   
    for(int j = 7; j >= 0; j--) {
        message[j] = ((byte)(i & 0xFF));
        i >>= 8;
    }
   
    Sha1.initHmac(key, 20);
    Sha1.writebytes(message, 8);
   
    uint8_t * hash = Sha1.resultHmac();
   
    int k = 0xF & hash[19];
    int m = ((0x7F & hash[k]) << 24 | (0xFF & hash[(k + 1)]) << 16 | (0xFF & hash[(k + 2)]) << 8 | 0xFF & hash[(k + 3)]) % 1000000;
    LCD.print(m, 2, 1);
    LCD.print(36 - timeLeft, 2, 15);
}
void loop() {
    LCD.clear();
    LCD.print("Current token:");
    showToken();
    delay(1000);
}

最后作者還分享了一個(gè),解決Arduino時(shí)間問(wèn)題的小技巧~這里省略啦~感興趣的同學(xué)可以去原文看。

原文地址:http://blog.valverde.me/2014/01/03/reverse-engineering-my-bank%27s-security-token/#.Uwa0CGI723D

責(zé)任編輯:藍(lán)雨淚 來(lái)源: FreeBuF
相關(guān)推薦

2018-07-09 09:35:11

死亡AI程序員

2012-02-16 13:43:42

2022-07-03 10:43:23

JS逆向破解

2011-08-15 09:31:55

2009-04-02 10:25:00

2022-11-30 09:54:57

網(wǎng)絡(luò)令牌身份驗(yàn)證

2022-10-20 10:37:44

2021-02-14 00:45:08

區(qū)塊鏈加密貨幣安全令牌

2021-03-11 09:05:45

互聯(lián)網(wǎng)科技技術(shù)

2010-05-26 09:03:20

2010-07-01 17:52:41

UML包圖

2022-09-19 13:37:57

五步優(yōu)化銀行專(zhuān)家

2009-02-27 13:38:00

傳真服務(wù)器傳真服務(wù)器設(shè)置

2011-06-09 10:28:35

2010-07-08 15:02:24

2018-12-04 09:00:00

API安全性令牌

2012-07-18 11:20:02

2024-02-02 08:56:54

2013-11-12 14:53:15

姜奇平

2010-08-18 10:17:12

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

欧美中文字幕不卡| 亚洲区一区二区三| 欧美激情黑白配| 成人51免费| 视频在线观看91| 精品国产乱码久久久久久闺蜜| 欧美在线一二三区| 99视频在线看| 国产精品网址| 一二三四区精品视频| 成人h猎奇视频网站| www.狠狠爱| xx欧美视频| 91久久极品少妇xxxxⅹ软件| 另类视频在线观看+1080p| 日本成人精品视频| 国产精品高清乱码在线观看| 成人性生交大片免费看中文| 久热精品视频在线| 亚洲视频在线观看一区二区三区| 天堂中文网在线| 激情六月综合| 欧美www视频| 超级碰在线观看| 国产精品久久久久毛片| 日韩精品欧美| 欧美剧在线免费观看网站| 日韩影片在线播放| 五月激情丁香网| 国产一区日韩| 欧美日韩三级视频| 中文字幕一区二区三区在线乱码 | 91精品国产91久久久久久久久| 黄色三级视频在线播放| 国内精品久久久久久野外| 欧美精品一区二区久久| 色婷婷亚洲一区二区三区| 久久人人爽爽人人爽人人片av| 男人天堂中文字幕| 首页亚洲中字| 欧美在线视频全部完| 久久综合久久网| 男人天堂资源在线| 开心九九激情九九欧美日韩精美视频电影 | 精品亚洲自拍| 精品国产福利视频| 日韩欧美手机在线| 欧美另类自拍| 91一区二区三区在线观看| 国产精品99久久99久久久二8| 亚洲色图欧美色| 日韩欧美另类中文字幕| 亚洲午夜电影网| 欧美精品二区三区四区免费看视频| 中文字幕在线欧美| 午夜精品毛片| 亚洲娇小xxxx欧美娇小| 在线视频日韩一区| 亚洲不卡系列| 亚洲综合激情小说| 国产女人18毛片| 在线黄色网页| 国产色婷婷亚洲99精品小说| 成人写真福利网| 一区二区 亚洲| 在线日韩视频| 日韩亚洲成人av在线| 国产av一区二区三区传媒| 亚洲日本天堂| 亚洲精品国产精华液| 欧美xxxx黑人又粗又长密月 | 日韩电影中文字幕| 又色又爽又高潮免费视频国产| 免费网站黄在线观看| 99久久精品久久久久久清纯| 精品网站在线看| 国产精品高潮呻吟av| 麻豆成人在线观看| 97伦理在线四区| 日本成人动漫在线观看| 久久99久久99| 欧美又大粗又爽又黄大片视频| 国产精品一区二区亚洲| 欧美丰满日韩| 国产亚洲精品激情久久| 国产女主播在线播放| 欧美亚洲色图校园春色| 日韩天堂在线观看| 日韩高清第一页| 刘亦菲一区二区三区免费看| 欧美亚洲自拍偷拍| 日韩欧美在线播放视频| 欧美xxxx少妇| 亚洲人吸女人奶水| 亚洲人一区二区| 国产小视频免费在线网址| 久久亚洲国产精品一区二区| 国产精品久久久久秋霞鲁丝| 五月天综合激情网| 伊人久久久大香线蕉综合直播| 78色国产精品| 国产精品伊人久久| 99精品国产99久久久久久白柏| 亚欧洲精品在线视频免费观看| 色视频在线看| 99久久国产综合精品女不卡| 日韩精品久久久毛片一区二区| av免费在线观看网站| 色综合天天综合在线视频| 亚洲精品免费一区亚洲精品免费精品一区| 自拍视频在线看| 91精品在线免费观看| www.超碰97.com| 加勒比色老久久爱综合网| 国产在线一区二| 北条麻妃亚洲一区| 成人午夜亚洲| 欧美成人中文| 一区二区三区四区视频精品免费| 国产欧美自拍视频| av电影在线观看| 国产区在线观看成人精品 | 成人国产在线| 日韩av在线高清| 黄色一级视频免费| 中文字幕一区二区三三| 久久这里只有精品99| 国产一级18片视频| 国产成人午夜电影网| 91视频网页| chinese偷拍一区二区三区| 日本一区二区三区四区在线视频| 亚洲黄色网址在线观看| 国产亚洲精品精品国产亚洲综合| 欧美亚洲高清一区二区三区不卡| 美女黄色一级视频| 久久夜色精品国产噜噜av小说| 日韩少妇与小伙激情| 中文字幕一区在线播放| 99久久伊人网影院| 日韩精品在线免费观看| 不卡一卡2卡3卡4卡精品在| 国产精品自拍电影| 欧美国产成人精品| 日本女人高潮视频| h1515四虎成人| 国产亚洲一区精品| 秋霞av一区二区三区| 久久精品国产网站| 日韩精品一区二区三区外面| 欧美大胆成人| 91麻豆精品91久久久久同性| 少妇高潮惨叫久久久久| 麻豆视频一区二区| 麻豆中文字幕在线观看| 丁香影院在线| 色成人在线视频| www,av在线| 婷婷久久综合| 欧美一级高清免费| 三级黄视频在线观看| 欧美视频中文在线看| 天天操狠狠操夜夜操| 色综合五月天| 国产视频999| 色猫av在线| 欧美午夜精品伦理| 精品人伦一区二区| 欧美欧美天天天天操| 日韩av免费在线| 精品毛片在线观看| 国产片一区二区| 日本在线观看免费视频| 91精品入口| 在线播放日韩av| 伊人国产在线观看| 久久99精品久久久久| 中文字幕人成一区| 风间由美中文字幕在线看视频国产欧美 | 亚洲自拍偷拍欧美| 玖玖爱在线精品视频| 97在线精品| 亚洲综合小说区| www日韩tube| 正在播放亚洲一区| 日韩成人免费在线视频| 国产午夜精品一区二区| 中文字幕1234区| 在线看片日韩| 亚洲a∨一区二区三区| 日韩三级av高清片| 欧美在线观看网站| 国产在线二区| 亚洲精品日韩欧美| 国产精品怡红院| 欧美性jizz18性欧美| 美女网站视频色| 99精品视频中文字幕| 天天爽人人爽夜夜爽| 国产精品99一区二区| 秋霞久久久久久一区二区| 麻豆精品久久| 日韩少妇与小伙激情| 亚洲免费成人网| 亚洲一区二区在线播放相泽| www.免费av| 亚洲精品社区| 亚洲一区二区三区涩| 色婷婷久久久| 亚洲一区久久久| 高清成人在线| 午夜精品一区二区三区在线视频 | 日韩精品资源| 国产ts一区| 91麻豆国产精品| 国产黄大片在线观看画质优化| 欧美日韩免费观看一区二区三区| 久久久国产精品人人片| 国产白丝网站精品污在线入口| 伊人再见免费在线观看高清版| 综合亚洲自拍| 91av福利视频| 中文字幕伦理免费在线视频| 在线视频欧美日韩精品| 在线观看视频中文字幕| 中文字幕一区在线观看| 国产欧美精品一二三| 天堂成人免费av电影一区| 福利在线一区二区| 日韩欧美四区| 国产精品久久久久久久久久久久午夜片 | 不卡av在线网| 日本www在线播放| 欧美美乳视频| 国产伦精品一区二区三区在线 | 欧美日韩亚洲综合| 亚洲怡红院在线观看| 久久九九影视网| 999在线观看| 日韩激情中文字幕| 丰满女人性猛交| 成人免费看片39| 97操在线视频| 国产精品亚洲欧美一级在线| 国产精品一区二区久久久久| 亚洲91av| 国产视频一区在线| 五月婷婷激情在线| 人人妻人人澡人人爽精品欧美一区| 国产精品欧美亚洲| 欧美视频精品在线观看| 天天操夜夜操视频| 丁香五六月婷婷久久激情| 国产xxxxhd| 极品少妇一区二区三区精品视频| 久久99国产精品一区| 91精品蜜臀一区二区三区在线| 亚洲精品美女久久7777777| 欧美影院精品| 亚洲最大av网| 91精品国产自产在线丝袜啪| 国产精品一区二区三区在线| 韩国女主播一区二区三区| 国产丝袜不卡| 妖精视频一区二区三区| 日本一区二区不卡高清更新| 精品国产一区一区二区三亚瑟| 日韩精品极品视频在线观看免费| 日韩成人影院| www国产无套内射com| 精品国产一区二区三区久久久蜜臀 | 精品视频一区 二区 三区| 精品国产一区二区三区四| 天天av天天翘天天综合网色鬼国产| 国产成人在线观看网站| 色噜噜狠狠成人中文综合| 一级黄色a视频| 曰本一区二区三区视频| 96pao国产成视频永久免费| 亚洲亚洲一区二区三区| 成人精品免费看| 欧洲美女亚洲激情| 国产jizzjizz一区二区| 欧美 日本 国产| 中文字幕的久久| 欧美日韩人妻精品一区二区三区| 国内精品写真在线观看| 黑人性生活视频| 青青草国产精品97视觉盛宴| 国产免费黄色小视频| 亚洲天堂一区二区三区四区| 国产一级大片在线观看| 国产精品综合网| 欧日韩免费视频| 这里只有精品在线| 国产精品久久久久久久乖乖| 久久精品天堂| 欧美深夜福利视频| 日韩电影免费一区| 免费观看污网站| 中文字幕免费一区| 国产精品2020| 欧美日韩精品专区| 亚洲av成人精品一区二区三区在线播放| 在线播放国产精品| 国产精选在线| 欧美精品videosex性欧美| √天堂8在线网| 日韩av片永久免费网站| 我要色综合中文字幕| 日韩国产精品一区二区三区| 欧美日韩福利| 成年人三级黄色片| 久久综合色之久久综合| 中文字幕xxx| 久久综合色8888| 亚洲女人天堂网| 一区二区视频免费| 欧美色网一区二区| 天天操天天操天天干| 久久精品电影网| 伊人福利在线| 国产精品一区二区三区久久 | 色悠悠亚洲一区二区| aaa级黄色片| 精品久久久久久久久久久久久久久久久| 毛片在线播放网址| 51ⅴ精品国产91久久久久久| 深夜福利一区| 无码人妻aⅴ一区二区三区日本| 久久一日本道色综合久久| 午夜视频在线观看国产| 99久久99久久久精品齐齐| 青娱乐在线视频免费观看| 欧美日韩国产不卡| 国产色a在线| 日本精品久久久久久久| 色先锋久久影院av| 黄色一级片播放| 青青草国产精品97视觉盛宴| 成人影视免费观看| 亚洲午夜激情网页| 亚洲av无码乱码国产精品| 亚洲第一国产精品| 国产视频第一页在线观看| 日本欧美一二三区| 欧美激情在线免费| 亚洲视频在线观看一区二区三区| 久久免费国产精品| 99re这里只有精品在线| 亚洲毛片一区二区| 午夜精品久久久久久久久久蜜桃| 欧美精品v日韩精品v国产精品| 久久av在线| 亚洲精品国产一区黑色丝袜| 91久久精品一区二区| 成年人在线观看网站| 国产精品一区二区性色av| 91久久电影| 一级黄色大片免费看| 中文字幕精品三区| 国内av在线播放| 久久久999精品视频| 日韩中文字幕无砖| 国产美女主播在线| 91香蕉国产在线观看软件| 欧美一级特黄高清视频| 91精品国产色综合久久ai换脸 | 亚洲美女视频网| 亚洲高清黄色| 一区在线电影| 国产aⅴ综合色| 五月婷婷中文字幕| 在线视频亚洲欧美| 视频一区日韩精品| 欧美亚洲精品一区二区| 久久久久99精品一区| 一二三四区在线| 高清一区二区三区日本久| 日本黄色成人| 日本一区二区久久精品| 日本视频一区二区三区| 国产探花在线播放| 亚洲精美色品网站| 国外成人福利视频| 人妻激情另类乱人伦人妻| 9色porny自拍视频一区二区| 激情网站在线观看| 亚洲精品一区中文| 国产精品99久久久久久董美香 | 高清国产在线一区| 日韩精品免费一区二区在线观看 | 91在线看国产| 一级片在线免费观看视频| 欧美精品久久久久| 清纯唯美日韩| 国产午夜在线一区二区三区| 在线亚洲高清视频| 国产一线二线在线观看| 日韩精品一区二区三区久久|