日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

LINQ - 對付 SQL Injection 的 免費補洞策略 (转)

發(fā)布時間:2023/12/9 数据库 58 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LINQ - 對付 SQL Injection 的 免費補洞策略 (转) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
LINQ - 對付 SQL Injection 的 "免費補洞策略"

LINQ - 對付 SQL Injection 的 "免費補洞策略"

作者:黃忠成

一連串的 Mass SQL Injection 攻擊,讓我們回憶起數(shù)年前的 SQL Injection 攻擊,多年後的今天,我們?nèi)陨钕蒽锻瑯拥奈C中,本文詳述 SQL Injection 的歷史、肇因、解決及偵測方法,更為讀者們引介全新、更加安全的防堵 SQL Injection 策略。

什麼是 SQL Injection?

SQL Injection,中譯為 SQL 注入,更為人知的名稱是【資料隱碼攻擊】,意指開發(fā)人員於撰寫網(wǎng)頁應(yīng)用程式之際,貪圖一時方便或是依循前人的慣性寫法而開啟的一道門。在數(shù)年前,一次大型的隱碼攻擊行動,喚起了所有網(wǎng)站擁有者及設(shè)計人員的防駭之心,讓我們認(rèn)知到,網(wǎng)站是一個曝露在所有人面前的公共園地,其安全性不容忽視!在那次的攻擊行動中,有數(shù)千個網(wǎng)站遭到同一種手法入侵,洩露的資料及因入侵所損失的金額難以估計,而起源竟只是程式設(shè)計師的慣性及疏於防範(fàn),而我們都曾經(jīng)是其中一份子。

那具體上,什麼是 SQL Injection 呢?其實說穿了很簡單,就是透過網(wǎng)頁上的輸入?yún)^(qū)域 (INPUT 如文字輸入框,或是 URL 中的查詢字串),將特定的 SQL 語句透過網(wǎng)頁送往資料庫執(zhí)行。以一個登入網(wǎng)頁為例,在設(shè)計登入網(wǎng)頁時,我們會放兩個 TextBox 控件,分別讓使用者填入使用者 ID 及密碼,類似畫面如下:

圖 1:

在使用者按下登入按鈕後,我們將其輸入的資訊送往資料庫,驗證使用者輸入的登入資訊是否正確:

using System; using System.Configuration; using System.Data; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Data.SqlClient; public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } protected void Button1_Click(object sender, EventArgs e) { if (ValidateUser(TextBox1.Text, TextBox2.Text)) Label1.Text = "歡迎你"; else Label1.Text = "登入失敗"; } private bool ValidateUser(string userName, string password) { SqlConnection conn = new SqlConnection( "Data Source=JEFFRAY;Initial Catalog=Northwind;Integrated Security=True"); using (conn) { SqlCommand cmd = new SqlCommand("SELECT COUNT(*) FROM USERS WHERE USER_ID = '" + userName + "' AND PASSWORD = '" + password + "'", conn); conn.Open(); return ((int)cmd.ExecuteScalar() > 0); } } }

當(dāng)你寫下這些程式碼時,已經(jīng)開啟了 SQL Injection 的大門了,只要使用者於登入時,填入下圖的資訊,那麼不管 ID 密碼是什麼,一律可以登入系統(tǒng)。

圖 2:

這是為什麼呢?很簡單,起因於下面這行程式碼:

SqlCommand cmd = new SqlCommand("SELECT COUNT(*) FROM USERS WHERE USER_ID = '" + userName + "' AND PASSWORD = '" + password + "'", conn);

我們使用傳統(tǒng) ASP 常見的手法,以組裝 SQL 指令的方式,將使用者的輸入融入既定的 SQL 語句中,但卻忽略了一件重要的事:使用者可以輸入任意的字串,包括了部份的 SQL 指令!透過輸入部份的 SQL 指令及微調(diào),使用者可以輕易的改變這段 SQL 指令,甚至是疊加另一串 SQL 指令,而我們的網(wǎng)頁則照單全收,以上的輸入,會將整句 SQL 語句調(diào)整成下面這樣:

圖 3:

透過必然成真的條件式,再加上 SQL 的註解,我們的網(wǎng)站就這樣曝露在網(wǎng)路上,今天我加的是 OR,若是狠一點的加上 DROP TABLE 等破壞性指令,網(wǎng)站就此拜拜。

這種攻擊不僅僅出現(xiàn)在上例這種 POST 狀況,另一種 GET 狀態(tài)也常常受到同樣的攻擊,例如下面的程式碼即開啟了 SQL Injection 的大門。

using System; using System.Collections; using System.Configuration; using System.Data; using System.Linq; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Data.SqlClient; public partial class QueryStringInjection : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { SqlConnection conn = new SqlConnection("Data Source=JEFFRAY;Initial Catalog=Northwind;Integrated Security=True"); using (conn) { SqlCommand cmd = new SqlCommand( "SELECT * FROM Customers WHERE CustomerID = '"+Request.QueryString["ID"]+"'", conn); conn.Open(); DetailsView1.DataSource = cmd.ExecuteReader(CommandBehavior.CloseConnection); DetailsView1.DataBind(); } } } }

試著在 URL 上鍵入:

http://localhost:43236/FirstInjection/QueryStringInjection.aspx?ID=VINET' OR 1=1 --
註:http://localhost:43236 是你的 Web Development Server 自動產(chǎn)生的 Port,你必須視情況修改。

結(jié)果你會看到 CustomerID="VINET" 以外的 ALFKI 資料列,如下圖:

圖 4:

如果有心人士在 URL 上鍵入 DROP TABLE 或是 INSERT 的 QueryString,將資料任意的刪除或插入惡意的連結(jié) Script (詳見後述的 Mass SQL Injection 一節(jié)),那後果不堪設(shè)想。

未啟用 Custom Error Page 的漏洞

你應(yīng)該已經(jīng)知道,寫 ASP.NET 應(yīng)用程式的第一道安全手續(xù)就是啟用 Custom Error Page 功能,讓駭客們無法透過預(yù)設(shè)的錯誤網(wǎng)頁來取得不該取得的資訊,若未啟用 Custom Error Page,那麼下圖是可能發(fā)生在你的網(wǎng)站中的:

圖 5:

有了這些資訊,具有耐心的駭客,要透過輸入不同的字元來探測整段 SQL 語句就不困難了,防堵的最佳辦法就是啟用 Custom Error Page 設(shè)定:

Web.config
...............略<customErrors mode="On" defaultRedirect="DefaultError.htm"></customErrors>............略

一旦啟用後,錯誤發(fā)生時會導(dǎo)向 DefaultError.html,結(jié)果變成下面這樣:

圖 6:

檢測你的網(wǎng)頁有無 SQL Injection 的可能性

OK,那有沒有辦法可以檢測現(xiàn)在的網(wǎng)頁是否受 SQL Injection 威脅呢?如果你是網(wǎng)站管理者,而非設(shè)計師,那麼你只有依賴現(xiàn)在常見的網(wǎng)頁漏洞檢測工具,對網(wǎng)頁進行黑箱測試,不過提醒你,目前的網(wǎng)頁漏洞測試工具大多是針對 PHP、ASP 所設(shè)計的,能測出來的漏洞相當(dāng)有限,有時即使是安全的網(wǎng)頁,也會因為未實作過濾法(後述),而導(dǎo)致誤判。

如果你是程式設(shè)計師,事情就簡單的多了,只要檢視一下程式碼,看看動態(tài)組裝 SQL 語句的部份是否有 SQL Injection 即可,圖 007 是一個確認(rèn) SQL Injection 是否存在於你的程式中的公式。

圖 7:

只要你的程式中,有 SQL 字串加上使用者輸入值的情況,那麼該網(wǎng)頁存在 SQL Injection 危機的可能性就高達 99.9%。

前輩的叮嚀:防止 SQL Injection 的方法

在數(shù)千個網(wǎng)站的入侵事件發(fā)生後,許多資安專家提出了各種防範(fàn) SQL Injection 的方法,其中不外乎圖 008 的四種。

圖 8:

過濾法可以阻止特定字如【--】、【 OR 】、【'】的輸入,能有效防堵必然成真條件式及錯誤訊息顯示時的漏洞,不過魔高一丈,此法最後仍然遭受破解,透過 SQL 的轉(zhuǎn)碼函式,駭客可以將部份 SQL 語句做出編碼來逃避偵測,最後突破這道防線。但由於轉(zhuǎn)碼後的字串相當(dāng)長,所以只要設(shè)計師細(xì)心些,搭配 MaxLength 的設(shè)定,還是可以讓過濾法奏效,但過濾法其實很脆弱,所以一定要搭配其它的手法方能行之。

下面是一個使用過濾法的例子,利用引入外部 JavaScript 檔案及 Form 的 onSubmit 事件,在送出資料前先檢測擁有 ci Attribute 標(biāo)示的 text tag,此法可運行於 IE 及 FireFox 上:

Injectiondetect.js

function validateInjection() { var i = 0; for(i = 0; i < document.forms[0].elements.length;i++) { if(document.forms[0].elements[i].type == 'text' && document.forms[0].elements[i].getAttribute("ci") != null) { var elem = document.forms[0].elements[i]; if(elem.value != null && (elem.value.indexOf('\'') != -1 || elem.value.indexOf('--') != -1 || elem.value.indexOf(' OR ') != -1)) { alert('possible injection detected.') return false; } } } return true; }

.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="DefaultWithFilter.aspx.cs" Inherits="DefaultWithFilter" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title>Untitled Page</title> <script language='javascript' type="text/javascript" src='injectiondetect.js'> </script> </head> <body> <form id="form1" οnsubmit="return validateInjection()" runat="server"> <div> <table border="1"> <tr> <td>使用者編號</td> <td><asp:TextBox ID="TextBox1" ci="true" MaxLength="12" runat="server"></asp:TextBox></td> </tr> <tr> <td>密碼</td> <td><asp:TextBox ID="TextBox2" ci="true" MaxLength="12" runat="server"></asp:TextBox></td> </tr> <tr> <td colspan=2> <asp:Button ID="Button1" runat="server" Text="登入" οnclick="Button1_Click" /> </td> </tr> </table> <asp:Label ID="Label1" runat="server" Text=""></asp:Label> </div> </form> </body> </html>

下圖是嘗試於此網(wǎng)頁進行 SQL Injection 攻擊時的結(jié)果:

圖 9:

不過,這種過濾法還不完善,因為資深的駭客仍然可以透過將網(wǎng)頁存成 HTML,移除 JavaScript 認(rèn)證並假造 ViewState 來對網(wǎng)站進行 SQL Injection 攻擊!所以,完善的過濾法應(yīng)該是 Client 端與 Server 都有,Server 端如下所示:

.aspx.cs

using System; using System.Collections; using System.Configuration; using System.Data; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Data.SqlClient; public partial class DefaultWithFilter : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } private bool DetectInjection(string input) { if (input.IndexOf("'") != -1 || input.IndexOf("--") != -1 || input.IndexOf(" OR ") != -1) return true; return false; } protected void Button1_Click(object sender, EventArgs e) { if (TextBox1.Text.Length > 12 || TextBox2.Text.Length > 12 || DetectInjection(TextBox1.Text) || DetectInjection(TextBox2.Text)) { ClientScript.RegisterStartupScript(typeof(Page), "Alert_Msg", "alert('possible injection detected.')", true); return; } if (ValidateUser(TextBox1.Text, TextBox2.Text)) Label1.Text = "歡迎你"; else Label1.Text = "登入失敗"; } private bool ValidateUser(string userName, string password) { SqlConnection conn = new SqlConnection( "Data Source=JEFFRAY;Initial Catalog=Northwind;Integrated Security=True"); using (conn) { SqlCommand cmd = new SqlCommand("SELECT COUNT(*) FROM USERS WHERE USERS.USER_ID = '" + userName + "' AND USERS.PASSWORD = '" + password + "'", conn); conn.Open(); return ((int)cmd.ExecuteScalar() > 0); } } }

或許你會覺得實作起來挺麻煩的,但這是過濾法所需付出的代價!

除了過濾法外,使用低權(quán)限的帳號連結(jié)資料庫也是安全常識之一,藉由降低連線帳號的權(quán)限,可以讓 DROP TABLE 等破壞力超強的手法碰壁,不過這種手法不應(yīng)該成為唯一防堵 SQL Injection 的方式,因為你不可能連 INSERT 都不給執(zhí)行,而 INSERT 是駭客入侵網(wǎng)頁的常見手法。

使用 Parameter 是目前已知,一勞永逸逃離 SQL Injection 的手法,將前述的程式調(diào)整成下面這樣,即可讓其完全逃離 SQL Injection。

using System; using System.Collections; using System.Configuration; using System.Data; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Data.SqlClient; public partial class Default2 : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } protected void Button1_Click(object sender, EventArgs e) { if (ValidateUser(TextBox1.Text, TextBox2.Text)) Label1.Text = "歡迎你"; else Label1.Text = "登入失敗"; } private bool ValidateUser(string userName, string password) { SqlConnection conn = new SqlConnection( "Data Source=JEFFRAY;Initial Catalog=Northwind;Integrated Security=True"); using (conn) { SqlCommand cmd = new SqlCommand( "SELECT COUNT(*) FROM USERS WHERE USER_ID = @USER_ID AND PASSWORD = @PASSWORD", conn); cmd.Parameters.AddWithValue("@USER_ID", userName); cmd.Parameters.AddWithValue("@PASSWORD", password); conn.Open(); return ((int)cmd.ExecuteScalar() > 0); } } }

失效了嗎?這些方法

上節(jié)提及的幾種防堵 SQL Injection 的方法,在業(yè)界已經(jīng)流傳許久,其中使用 Parameter 更是快變成常識級的考古用知識。那為何到目前為止,你仍然時常聽到某某網(wǎng)站遭受 SQL Injection 攻擊,甚至!你只要有足夠的時間及耐心,用 Google 以關(guān)鍵字【登入】、【資料查詢】查詢,接著以上述的【' OR 1=1 --】或是【'】來一一測試,輕輕鬆鬆就能找到幾個吃這套技巧的網(wǎng)站,然後取得極度敏感的個人資料或是其用來查詢的 SQL 字串。

SQL Injection 至今仍然存在的原因很簡單,程式設(shè)計師的惰性、慣性及大而化之的個性,是導(dǎo)致 SQL Injection 存在於這個高安全性當(dāng)?shù)罆r代的最大原因。

雖然使用 Parameter 手法可以防掉所有的 SQL Injection 攻擊,但在此同時,也增加了需要撰寫的程式碼長度,常見的結(jié)果便是設(shè)計師只會在特定敏感功能上,才會使用這種手法。

在現(xiàn)時今日,你很難當(dāng)起駭客,透過 SQL Injection 手法通過極大多數(shù)網(wǎng)站的【登入】機制,原因不是程式設(shè)計師及網(wǎng)站管理者的細(xì)心,而是這個機制曾經(jīng)出了個所有人都無法忽視的大包, 但 SQL Injection 只出現(xiàn)在這些機制上嗎?你我都知道,這不是真的,舉個實例來說,以下的查詢網(wǎng)頁是相當(dāng)常見的。

圖 10:

這個網(wǎng)頁允許使用者任意輸入【公司名稱】、【客戶編號】、【聯(lián)絡(luò)人】等三個欄位之搜尋字串,然後進行組合查詢,如果使用者僅輸入【公司名稱】,那麼系統(tǒng)將不會把其它兩個欄位放入查詢語句中,請先閉上眼睛,思考著你怎麼實現(xiàn)這個功能,如果結(jié)果是下面這樣,那你已然開啟 SQL Injection 的大門了。

protected void Button1_Click(object sender, EventArgs e) { SqlConnection conn = new SqlConnection( "Data Source=JEFFRAY;Initial Catalog=Northwind;Integrated Security=True"); using (conn) { SqlCommand cmd = new SqlCommand("SELECT * FROM Customers", conn); string cmdStr = ""; if(TextBox1.Text.Length > 0) cmdStr += string.Format(" CompanyName LIKE '%{0}%' AND ",TextBox1.Text); if(TextBox2.Text.Length > 0) cmdStr += string.Format(" CustomerID LIKE '%{0}%' AND ",TextBox2.Text); if(TextBox3.Text.Length > 0) cmdStr += string.Format(" ContactTitle LIKE '%{0}%' AND ",TextBox3.Text); if (cmdStr.Length > 0) cmd.CommandText += " WHERE " + cmdStr.Substring(0, cmdStr.Length - 5); conn.Open(); GridView1.DataSource = cmd.ExecuteReader(CommandBehavior.CloseConnection); GridView1.DataBind(); } }

導(dǎo)致我們寫下這個程式的原因有三個:

圖 11:

第三個原因大概是寫下此程式之設(shè)計師真正的想法,那會變多長呢?我們試著寫一下就知道了。

protected void Button1_Click(object sender, EventArgs e) { SqlConnection conn = new SqlConnection( "Data Source=JEFFRAY;Initial Catalog=Northwind;Integrated Security=True"); using (conn) { SqlCommand cmd = new SqlCommand("SELECT * FROM Customers", conn); string cmdStr = ""; if (TextBox1.Text.Length > 0) { cmdStr += " CompanyName LIKE @CName AND "; cmd.Parameters.AddWithValue("@CName", "%"+TextBox1.Text+"%"); } if (TextBox2.Text.Length > 0) { cmdStr += " CustomerID LIKE @CID AND "; cmd.Parameters.AddWithValue("@CID", "%" + TextBox2.Text + "%"); } if (TextBox3.Text.Length > 0) { cmdStr += " ContactTitle LIKE @CTitle AND "; cmd.Parameters.AddWithValue("@CTitle", "%" + TextBox3.Text + "%"); } if (cmdStr.Length > 0) cmd.CommandText += " WHERE " + cmdStr.Substring(0, cmdStr.Length - 5); conn.Open(); GridView1.DataSource = cmd.ExecuteReader(CommandBehavior.CloseConnection); GridView1.DataBind(); } }

唔,也不是很長嘛,為了省幾行程式碼開這麼大的洞,值得嗎?呵,程式設(shè)計師就是這種動物,不是嗎?

補洞的代價

在你暗笑著,我怎麼可能會犯下前節(jié)的錯誤時,我必須提醒你程式設(shè)計師的第二個通病,那就是【以己度人】,白話就是【我不會犯的錯,所以別人也不會犯】,在群組開發(fā)時,這個情況更是履見不鮮。事實是,你不會寫下這段程式碼,但難保其它設(shè)計師不會,畢竟都是糊口飯吃的,只要補洞的工作需要付出時間代價,那麼就一定有人會偷懶或粗心,肇因可能是惰性、慣性,也可能是你未跟他明確提及這事兒的嚴(yán)重性,而後果常是我們無法承受的。

LINQ To SQL/LINQ To Entities = "免費的補洞策略"

除了程式設(shè)計師努力的防堵 SQL Injection 之外,開發(fā)平臺廠商也沒有置身事外,以 Microsoft .NET 平臺來說,為了防堵 SQL Injection,ASP.NET Team 於 ASP.NET 2.0 推出了 DataSource 控件群,這組控件利用了 Parameter 的手法,完全避開了 SQL Injection 的發(fā)生。但是我依舊時常聽到許多設(shè)計師抱怨:【DataSource 控件用起來綁手綁腳的,內(nèi)部不知道在搞什麼,還不如自己用 SqlCommand 來得快且直覺。】,的確,事實是如此,DataSource 控件為了防堵 SQL Injection 所做的努力,換來的是【綁手綁腳】的惡名,這該歸咎於 ASP.NET Team 設(shè)計 DataSource 控件時,沒有多花點心思在易用性、安全性、彈性上取得平衡點。

終於,在 .NET Framework 3.5 及 Visual Studio 2008 上市後,兩個免費、快速、有效的補洞策略出現(xiàn)在我們眼前,他們就是【LINQ To SQL/LINQ To Entities】

說實話!這兩個技術(shù)都不是為了 SQL Injection 而誕生的,但其預(yù)設(shè)以 Parameter 手法運行的設(shè)計,卻給了我們一個新的防堵 SQL Injection 的方法,更好的是,程式設(shè)計師不但不用為了防堵 SQL Injection 寫更多的程式碼,相反的程式碼還變少了,以最初的登入機制為例,用 LINQ To SQL 改寫後變成下面這樣:

using System; using System.Collections; using System.Configuration; using System.Data; using System.Linq; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Xml.Linq; public partial class LoginWithLINQ : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } protected void Button1_Click(object sender, EventArgs e) { NorthwindDataContext context = new NorthwindDataContext(); if( (from s1 in context.USERS where s1.USER_ID == TextBox1.Text && s1.PASSWORD == TextBox2.Text select s1).Count() > 0) Label1.Text = "歡迎你"; else Label1.Text = "登入失敗"; } }

由於 LINQ To SQL 會將 LINQ 運算式轉(zhuǎn)成 SQL 語句,然後將條件式一一以參數(shù)描述之故,透過 SQL Profiler 工具可得知,上面的程式最終送往 SQL Server 執(zhí)行的語句如下:

exec sp_executesql N'SELECT COUNT(*) AS [value] FROM [dbo].[USERS] AS [t0] WHERE ([t0].[USER_ID] = @p0) AND ([t0].[PASSWORD] = @p1)',N'@p0 varchar(5),@p1 varchar(4)',@p0='admin',@p1='test'

很明顯的,這個技巧完全沒有 SQL Injection 的危機存在。

想加來加去,又不要 SQL Injection 嗎?LINQ 做給你

複合查詢常讓設(shè)計師不得不採用組裝式 SQL 語句手法,而其結(jié)果也常因為使用 Parameter 會導(dǎo)致程式碼變複雜,而循傳統(tǒng)手法完成該功能,最後留下 SQL Injection 的漏洞。那使用 LINQ To SQL/LINQ To Entities 來改寫的話,真的可以避免 SQL Injection 及簡化程式碼嗎?讓實例說話吧,我們以上例的複合查詢?yōu)槔?#xff0c;改寫成 LINQ To SQL 版本之程式碼如下 :

protected void Button1_Click(object sender, EventArgs e) { NorthwindDataContext context = new NorthwindDataContext(); var baseData = from s1 in context.Customers select s1; if(TextBox1.Text.Length > 0) baseData = from s1 in baseData where s1.CompanyName.Contains(TextBox1.Text) select s1; if (TextBox2.Text.Length > 0) baseData = from s1 in baseData where s1.CustomerID.Contains(TextBox2.Text) select s1; if (TextBox3.Text.Length > 0) baseData = from s1 in baseData where s1.ContactTitle.Contains(TextBox3.Text) select s1; GridView1.DataSource = baseData; GridView1.DataBind(); }

此例中,我利用了 LINQ To SQL/LINQ To Entities 只在列舉資料集元素前,才會開始組裝 SQL 語句的共通行為,以疊加式查詢的方式來完成複合查詢的工作,請?zhí)貏e注意,這段程式碼只會送出一段 SQL 語句,不是四個,透過 SQL Profiler 可以證明這點:

exec sp_executesql N'SELECT [t0].[CustomerID], [t0].[CompanyName], [t0].[ContactName], [t0].[ContactTitle], [t0].[Address], [t0].[City], [t0].[Region], [t0].[PostalCode], [t0].[Country], [t0].[Phone], [t0].[Fax], [t0].[NOTES], [t0].[TEST_ID] FROM [dbo].[Customers] AS [t0] WHERE ([t0].[CustomerID] LIKE @p0) AND ([t0].[CompanyName] LIKE @p1)',N'@p0 nvarchar(4),@p1 nvarchar(3)',@p0=N'%FR%',@p1=N'%V%'

讓事實說話:LINQ To SQL VS SQL Injection

我說你不一定信,你可以下載範(fàn)例,然後對本文所提及的兩個 LINQ To SQL 網(wǎng)頁進行 SQL Injection 的測試,圖 012 是以【' OR 1=1 --】手法來測試登入機制:

圖 12:

圖 013 是複合查詢的測試:

圖 13:

改用 LINQ To Entities 也是一樣的結(jié)果。

幫幫忙,別自己開洞,ExecuteQuery 及 ExecuteCommand

那使用 LINQ To SQL/LINQ To Entities 就能保證不被 SQL Injection 所擾了嗎?那可不一定,因為設(shè)計師還是常常會貪一時方便,開啟 SQL Injection 的大門。基於彈性,LINQ To SQL 及 LINQ To Entities 都支援直接將 SQL 語句送往資料庫執(zhí)行的機制,LINQ To SQL 的 ExecuteQuery 就是一個例子:

protected void Button1_Click(object sender, EventArgs e) { NorthwindDataContext context = new NorthwindDataContext(); string str = "SELECT * FROM USERS WHERE USER_ID = '" + TextBox1.Text + "' AND PASSWORD = '" + TextBox2.Text + "'"; int ret = context.ExecuteQuery<USERS>(str).Count(); if (ret > 0) Label1.Text = "歡迎你"; else Label1.Text = "登入失敗"; }

所以,要防堵 SQL Injection,使用 LINQ To SQL/LINQ To Entities 是最具成效及具經(jīng)濟效益的,不過前提是設(shè)計師得幫幫忙,別放著有新的方便且有效率的技巧不學(xué),故意去當(dāng)打洞工人。

迷思:Stored Procedure 是安全的,Parameter 是無敵的?

的確,是我告訴你,使用 Parameter 是防堵 SQL Injection 最快、最有效、最完整的手法,但是前題是不能與 Stored Procedure 扯上關(guān)係!基於網(wǎng)路上的片段資料,設(shè)計師總覺得,如果我使用了 Stored Procedure,並使用 Parameter 來傳遞參數(shù),那就對 SQL Injection 完全免疫了!所有軟體專案主導(dǎo)者都同意,當(dāng)要求不明確時,結(jié)果也會不明確,基於防堵 SQL Injection 的大前題下,許多專案主導(dǎo)者都會要求設(shè)計師不要在程式中組裝 SQL 語句,而改用 Stored Procedure,但!他們卻高估了程式設(shè)計師的的理解力,天才工程師以 Stored Procedure 來處理複合查詢,寫下程式碼如下:

protected void Button1_Click(object sender, EventArgs e) { SqlConnection conn = new SqlConnection( "Data Source=JEFFRAY;Initial Catalog=Northwind;Integrated Security=True"); using (conn) { SqlCommand cmd = new SqlCommand("QueryCustomers", conn); cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.AddWithValue("@CompanyName", TextBox1.Text.Length == 0 ? "" : TextBox1.Text); cmd.Parameters.AddWithValue("@CustomerID", TextBox2.Text.Length == 0 ? "" : TextBox2.Text); cmd.Parameters.AddWithValue("@ContactTitle", TextBox3.Text.Length == 0 ? "" : TextBox3.Text); conn.Open(); GridView1.DataSource = cmd.ExecuteReader(CommandBehavior.CloseConnection); GridView1.DataBind(); } }

正如你所見,這是一段看不出問題在那的程式碼,直到看到了 QueryCustomers 的預(yù)存程序,你會吐血:

CREATE PROCEDURE dbo.QueryCustomers ( @CompanyName nvarchar(30), @CustomerID nvarchar(12), @ContactTitle nvarchar(30) ) AS DECLARE @STR nvarchar(255) DECLARE @WK nvarchar(255) SET @STR = 'SELECT * FROM Customers' SET @WK = '' IF NOT @CompanyName IS NULL SET @WK = @WK + ' CompanyName LIKE ''%'+@CompanyName+'%'' AND ' IF NOT @CustomerID IS NULL SET @WK = @WK + ' CustomerID LIKE ''%'+@CustomerID+'%'' AND ' IF NOT @ContactTitle IS NULL SET @WK = @WK + ' ContactTitle LIKE ''%'+@ContactTitle+'%'' AND ' IF LEN(@STR) > 0 BEGIN SET @STR = @STR+' WHERE '+SUBSTRING(@WK,0,LEN(@WK)-3) exec sp_executesql @STR End ELSE exec sp_executesql @STR

結(jié)果就是:

圖 14:

一旦變成這樣,就算是 LINQ To SQL/LINQ To Entities 也無法救你脫離 SQL Injection 的威脅!所以,你應(yīng)該明確的告訴設(shè)計師,SQL Injection 是由組裝式 SQL 語句而引發(fā)的,得注意任何有【組裝式 SQL】發(fā)生的程式碼,這當(dāng)然也包含了 Stored Procedure。此例正確的 Stored Procedure 寫法如下:

CREATE PROCEDURE dbo.SafeQueryCustomers ( @CompanyName nvarchar(30), @CustomerID nvarchar(12), @ContactTitle nvarchar(30) ) AS DECLARE @STR nvarchar(255) DECLARE @WK nvarchar(255) SET @STR = 'SELECT * FROM Customers' SET @WK = '' IF NOT @CompanyName IS NULL BEGIN SET @WK = @WK + ' CompanyName LIKE @pCompanyName AND ' SET @CompanyName = '%' +@CompanyName + '%' END IF NOT @CustomerID IS NULL BEGIN SET @WK = @WK + ' CustomerID LIKE @pCustomerID AND ' SET @CustomerID = '%' +@CustomerID + '%' END IF NOT @ContactTitle IS NULL BEGIN SET @WK = @WK + ' ContactTitle LIKE @pContactTitle AND ' SET @ContactTitle = '%' +@ContactTitle + '%' END IF LEN(@STR) > 0 BEGIN SET @STR = @STR+' WHERE '+SUBSTRING(@WK,0,LEN(@WK)-3) exec sp_executesql @STR, N'@pCompanyName nvarchar(30),@pCustomerID nvarchar(12),@pContactTitle nvarchar(30)', @pCompanyName=@CompanyName,@pCustomerID=@CustomerID,@pContactTitle=@ContactTitle End ELSE exec sp_executesql @STR

使用參數(shù)是防堵 SQL Injection 的不二法門,就算是在 Stored Procedure 中亦是如此。

魔高一丈:新一代的 Mass SQL Injection 手法

網(wǎng)頁的攻擊威脅中,SQL Injection 算是相當(dāng)狠毒的手法,因為破壞性高,所以也就更引人注目,但 SQL Injection 是一種手法的統(tǒng)稱,近日各大報的報導(dǎo),相信大多人都已見識到新一代的 SQL Injection 手法,統(tǒng)稱為【Mass SQL Injection】

此手法是利用了傳統(tǒng)的 SQL Injection 為進入點,再利用設(shè)計師對於控件行為的熟悉度不足,及忽視網(wǎng)頁安全性來侵入。舉個例來說,我們常用 GridView 等控件來顯示資料,為了某些理由,我們會直接以方式來輸出列資料,如下所示:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="InputInjection.aspx.cs" Inherits="InputInjection" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title>Untitled Page</title> </head> <body> <form id="form1" runat="server"> <div> <asp:LinqDataSource ID="LinqDataSource1" runat="server" ContextTypeName="NorthwindDataContext" Select="new (CustomerID, CompanyName, NOTES)" TableName="Customers"> </asp:LinqDataSource> <asp:GridView ID="GridView1" runat="server" AllowPaging="True" AutoGenerateColumns="False" DataSourceID="LinqDataSource1"> <Columns> <asp:BoundField DataField="CustomerID" HeaderText="CustomerID" ReadOnly="True" SortExpression="CustomerID" /> <asp:BoundField DataField="CompanyName" HeaderText="CompanyName" ReadOnly="True" SortExpression="CompanyName" /> <asp:TemplateField HeaderText="NOTES" SortExpression="NOTES"> <EditItemTemplate> <asp:Label ID="Label1" runat="server" Text='<%# Eval("NOTES") %>'></asp:Label> </EditItemTemplate> <ItemTemplate> <asp:Label ID="Label1" runat="server" Text='<%# Eval("NOTES") %>'></asp:Label> </ItemTemplate> </asp:TemplateField> </Columns> </asp:GridView> </div> </form> </body> </html>

很平常的程式碼不是,結(jié)果也很平常:

圖 15:

直到你在第一筆資料的 NOTES 欄位中鍵入下面的文字:

<script>alert('test')</script>

結(jié)果將會有所改變:

圖 16:

歡迎來到 Mass SQL Injection 的世界,Mass SQL Injection 利用了設(shè)計師常忽略了輸出資料時要使用 Html Encode 機制的常識,而進行了非毀滅性的入侵,這種入侵常見於討論區(qū)、部落格或留言版上,他的目的並非毀滅此網(wǎng)站,而只是利用此漏洞來當(dāng)?shù)舸司W(wǎng)站,亦或是將此網(wǎng)站做為跳板,以 Cross-Site Scripting (簡稱為 XSS) 的方式,將使用者所輸入的資料,導(dǎo)向另一網(wǎng)站,而這個網(wǎng)站通常是駭客們所建構(gòu)的,無辜瀏覽此網(wǎng)站的人所輸入的資料就這樣被偷走了。

另一種更狠毒的手法則是利用 Cross-Site Scripting 的方式,在網(wǎng)頁中注入惡意連結(jié)的 Script,透過作業(yè)系統(tǒng)的漏洞如 Windows 的 MS06-014、MS07-004 來入侵使用者的電腦,將網(wǎng)站當(dāng)成跳板是第一步,接著再把瀏覽器當(dāng)成第二跳版,最後入侵使用者的電腦。

當(dāng)然,你可能會說,我常用的是 Bind,不是 Eval 這個函式,那麼我告訴你,這兩者有同樣的問題存在。就算不用到 Eval 或是 Bind,你偶而也會寫成下面這樣子:

.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="InputInjection.aspx.cs" Inherits="InputInjection" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title>Untitled Page</title> </head> <body> <form id="form1" runat="server"> <div> <div><%=GetDynamicHtml() %></div> ..........略.......... </div> </form> </body> </html>

.aspx.cs

protected string GetDynamicHtml() { string str = "<b>TEST Injection</b>"; return str; }

想像一下,如果 GetDynamicHtml 函式中的 str 變數(shù)值是由資料庫取得後填入的,你是否有背脊發(fā)涼的感覺了。

如何防止?

防堵 Mass SQL Injection 的方法其實很簡單,除了以 Parameter 或是 LINQ To SQL/LINQ To Entities 來阻檔傳統(tǒng)的 SQL Injection 攻擊外,只要在輸出資料庫資料時,記得用 HtmlEncode 即可:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="InputInjection.aspx.cs" Inherits="InputInjection" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title>Untitled Page</title> </head> <body> <form id="form1" runat="server"> <div> <asp:LinqDataSource ID="LinqDataSource1" runat="server" ContextTypeName="NorthwindDataContext" Select="new (CustomerID, CompanyName, NOTES)" TableName="Customers"> </asp:LinqDataSource> <asp:GridView ID="GridView1" runat="server" AllowPaging="True" AutoGenerateColumns="False" DataSourceID="LinqDataSource1"> <Columns> <asp:BoundField DataField="CustomerID" HeaderText="CustomerID" ReadOnly="True" SortExpression="CustomerID" /> <asp:BoundField DataField="CompanyName" HeaderText="CompanyName" ReadOnly="True" SortExpression="CompanyName" /> <asp:TemplateField HeaderText="NOTES" SortExpression="NOTES"> <EditItemTemplate> <asp:Label ID="Label1" runat="server" Text='<%# Eval("NOTES") %>'></asp:Label> </EditItemTemplate> <ItemTemplate> <asp:Label ID="Label1" runat="server" Text= '<%# Server.HtmlEncode(Eval("NOTES") == null ? "" : Eval("NOTES").ToString()) %>'> </asp:Label> </ItemTemplate> </asp:TemplateField> </Columns> </asp:GridView> </div> </form> </body> </html>

圖 17:

那如果執(zhí)意輸出 HTML 呢?那我只能建議你,在輸出前查查輸出的字串中是否有 script 字樣,並注意 onclick、onkeydown、onblur 等事件及 src tag 的輸出,沒有必要的話,就把所有的事件處理式濾掉,這樣才能讓你逃出 Mass SQL Injection 的攻擊,下面是一個簡單的例子,允許除 script 外的 HTML 輸出。

.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="InputInjection2.aspx.cs" Inherits="InputInjection2" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title>Untitled Page</title> </head> <body> <form id="form1" runat="server"> <div> <asp:LinqDataSource ID="LinqDataSource1" runat="server" ContextTypeName="NorthwindDataContext" Select="new (CustomerID, CompanyName, NOTES)" TableName="Customers"> </asp:LinqDataSource> <asp:GridView ID="GridView1" runat="server" AllowPaging="True" AutoGenerateColumns="False" DataSourceID="LinqDataSource1"> <Columns> <asp:BoundField DataField="CustomerID" HeaderText="CustomerID" ReadOnly="True" SortExpression="CustomerID" /> <asp:BoundField DataField="CompanyName" HeaderText="CompanyName" ReadOnly="True" SortExpression="CompanyName" /> <asp:TemplateField HeaderText="NOTES" SortExpression="NOTES"> <EditItemTemplate> <asp:Label ID="Label1" runat="server" Text='<%# Eval("NOTES") %>'></asp:Label> </EditItemTemplate> <ItemTemplate> <asp:Label ID="Label1" runat="server" Text='<%# GetSafeHtml(Eval("NOTES")) %>'></asp:Label> </ItemTemplate> </asp:TemplateField> </Columns> </asp:GridView> </div> </form> </body> </html>

.aspx.cs

using System; using System.Collections; using System.Configuration; using System.Data; using System.Linq; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Xml.Linq; public partial class InputInjection2 : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } protected string GetSafeHtml(object o) { if (o != null) { string o2 = (string)o; if (o2.IndexOf("<script",StringComparison.InvariantCultureIgnoreCase) != -1) { while (true) { int index = o2.IndexOf("<script", StringComparison.InvariantCultureIgnoreCase); if (index == -1) break; o2 = o2.Replace(o2.Substring(index, 8), "<!-- "); index = o2.IndexOf("</script>", StringComparison.InvariantCultureIgnoreCase); o2 = o2.Replace(o2.Substring(index, 9), " !-->"); } } return o2; } return string.Empty; }}

當(dāng) NOTES 值為【<b>test</b>】時,輸出結(jié)果如下:

圖 18:

GetSafeHtml 也適用於前例的 GetDynamicHtml 情況下:

<div><%=GetSafeHtml(GetDynamicHtml()) %></div>

關(guān)於 validateRequest

或許你會好奇,ASP.NET 1.1 其之後的版本不是有一個 validateRequest 設(shè)定,只要其值為 True,那麼使用者所輸入的值,將會受到 ASP.NET 的限制 (TextBox、及 URL 後帶的參數(shù)都在此限),而此值預(yù)設(shè)為 True,意味著如果你沒有特別去修改 mechine.config 或是 web.config 將此值設(shè)為 False,使用者是無法於 TextBox 控件或是 URL 參數(shù)中輸入【<script>alert('test')</script】等字樣的,那也就沒有 Mass SQL Injection 危機了不是嗎?

Web.config

<system.web> ............ <pages buffer="true" validateRequest="true" /> ............ </system.web>

圖 19:

的確,但這樣一來,連【<b>TEST</b>】等輸入也一併被防掉了,在許多討論區(qū)及留言版中,這種輸入是必要的!況且,ASP.NET 1.x 在 validateRequest 的驗證上有著 BUG,若你未更新 ASP.NET 2.0 或是最新的 ASP.NET 1.x Service Pack,那麼 Mass SQL Injection 仍然與你長伴。

那如果用的已是 ASP.NET 2.0,且更新到最新版並將 validateRequest 設(shè)為 Ture 後,是否就可高枕無憂了呢?這我不能保證,因為在BUG未被發(fā)現(xiàn)前,都不叫 BUG!而且在這個 AJAX 盛行的年代,以 XMLHttpRequest 穿透 Validate Request 機制並不是不可能。所以,validateRequest 絕不能做為防止 Mass SQL Injection 的唯一手段,應(yīng)整合 SQL Injection 的所有防範(fàn)手段,至少必須使用 Parameter 或是 LINQ To SQL/LINQ To Entities 來與資料庫溝通,才是正道。

後記

因為網(wǎng)頁是隨手可得,所以成為了駭客們的玩具,本文所提及的僅是關(guān)於 SQL Injection 的手法,其它如 DDoS 等攻擊還是很多,身為網(wǎng)頁設(shè)計師的我們,除了必須細(xì)心之外,還得時常上一些安全性回報網(wǎng)站來擷取新知,對於駭客,我們必須常保初學(xué)者心態(tài),因為駭客們就是抓住程式設(shè)計師自持身經(jīng)百戰(zhàn)的傲氣,而趁虛而入。

範(fàn)例解說:

檔名說明
Default.aspx無設(shè)防之 Login 網(wǎng)頁 (有 SQL Injection 危機)。
Default2.aspx設(shè)防之 Login 網(wǎng)頁 (使用參數(shù),無 SQL Injection 危機)。
DefaultWithFilter.aspx設(shè)防之 Login 網(wǎng)頁,使用過濾法。
QueryStringInjection.aspx無設(shè)防之 QueryString 網(wǎng)頁(有 SQL Injection 危機)。
InputInjection.aspxMass SQL Injection 測試網(wǎng)頁 (已設(shè)防,請自行調(diào)整為不設(shè)防來測試),使用LINQ To SQL。
InputInjection2.aspxMass SQL Injection 測試網(wǎng)頁 2 (已設(shè)防,採用過濾 script 手法) ,使用 LINQ To SQL。
QueryData.aspx簡單資料查詢頁面 (無設(shè)防,有 SQL Injection 危機)。
QueryData2.aspx簡單資料查詢頁面 (已設(shè)防,使用參數(shù),無 SQL Injection 危機)。
QueryData3.aspx複合查詢頁面 (無設(shè)防,包含無設(shè)防及有設(shè)防之 Stored Procedure 手法)。
QueryData4.aspx複合查詢頁面 (已設(shè)防,無 SQL Injection 危機)。
LoginWithLINQ.aspx設(shè)防之 Login 網(wǎng)頁,使用 LINQ To SQL。
QueryData4WithLinq.aspx設(shè)防之複合查詢頁面,使用 LINQ To SQL。


http://www.microsoft.com/taiwan/msdn/columns/huang_jhong_cheng/LVSS.htm

轉(zhuǎn)載于:https://www.cnblogs.com/yhb199/archive/2008/07/11/1240557.html

總結(jié)

以上是生活随笔為你收集整理的LINQ - 對付 SQL Injection 的 免費補洞策略 (转)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

国产一级黄大片 | 亚洲人成人天堂h久久 | 久久成人综合视频 | 青青河边草手机免费 | 日韩在线中文字幕视频 | 免费在线视频一区二区 | 久久草在线视频国产 | 美女中文字幕 | 免费观看全黄做爰大片国产 | 国产精品永久在线观看 | 超碰公开在线观看 | 日日爱999 | 超碰国产在线 | 国内精品视频在线 | 日韩在线不卡视频 | 一级a性色生活片久久毛片波多野 | av大全在线免费观看 | 午夜18视频在线观看 | 综合国产在线 | av一区二区三区在线 | 波多野结衣久久资源 | 国产区第一页 | 国产天天综合 | 久久精品视频2 | 91精品黄色 | 不卡视频一区二区三区 | 日日操狠狠干 | 欧美视频日韩视频 | 不卡的av片 | 国产亚洲高清视频 | 亚洲国产精品va在线看黑人 | 91mv.cool在线观看 | 日韩在线精品 | 久久久久久久久久久久久久电影 | 欧美性黑人 | 国产在线精品福利 | 国产高清网站 | 国产我不卡 | 精品久久久久国产 | 国产玖玖精品视频 | 91精品久久久久久久99蜜桃 | 成人免费观看视频大全 | 亚洲日本精品视频 | 婷婷色资源 | 狠狠色伊人亚洲综合网站野外 | 婷婷久久国产 | 不卡av电影在线 | 国产成人一区二区精品非洲 | 国产99久久久久久免费看 | 日韩午夜av | 丁香高清视频在线看看 | 中文字幕在线观看一区 | 亚洲视频分类 | 黄色大全免费观看 | а天堂中文最新一区二区三区 | 亚洲午夜久久久久 | 天天爽夜夜爽人人爽一区二区 | 麻豆视频在线免费看 | 91在线视频免费观看 | 国产片免费在线观看视频 | 91chinese在线 | 国产无遮挡又黄又爽馒头漫画 | 久久手机在线视频 | 日韩精品一区二区三区中文字幕 | 99热这里只有精品在线观看 | 东方av在线免费观看 | 在线观看免费av片 | 国产精品久久久久一区二区 | 91网址在线观看 | 久久人人爽人人爽人人 | 久久人网 | 久久视频国产 | 国产中文字幕国产 | 欧美日韩一区二区视频在线观看 | 国产婷婷一区二区 | 精品国产乱码一区二 | 久99久中文字幕在线 | 国产黄在线免费观看 | 国产免费午夜 | 国产区第一页 | 久久乐九色婷婷综合色狠狠182 | 久久精品99国产国产 | 久人人| 欧美亚洲成人免费 | 亚洲成人黄色av | 婷婷精品进入 | 亚洲三级av | 国产精品 日韩 欧美 | 国产免费片 | 黄色毛片大全 | 久久69精品久久久久久久电影好 | 黄色.com| 欧美一区二区日韩一区二区 | 精品国产一区二区三区四 | 久久看片网站 | 在线观看aa | 在线成人性视频 | 久久精品精品电影网 | 日韩亚洲国产精品 | 国产精品岛国久久久久久久久红粉 | 亚洲欧美日韩一区二区三区在线观看 | 免费成人av| 狠狠网站 | 人人看人人艹 | 亚洲精品视频久久 | 中文字幕国产在线 | 91在线中文字幕 | 日韩一区二区三区在线看 | 日日操日日插 | 欧美日韩午夜爽爽 | 亚洲成人免费在线观看 | 日韩视频一二三区 | 亚洲视频久久久久 | 成人黄色毛片视频 | 欧洲一区二区三区精品 | 成人午夜影院在线观看 | 日韩欧美极品 | 探花国产在线 | 天天天天干 | 伊人色**天天综合婷婷 | 国产资源免费在线观看 | 97超碰人人网 | 国产三级av在线 | 免费看成人a | 精品久久五月天 | 久久成人精品 | 九九免费观看视频 | 日韩理论片 | 最近中文字幕mv免费高清在线 | 国产精品久久一区二区无卡 | 亚洲狠狠操 | 亚洲精品1234区 | 日韩三级.com| 伊人婷婷 | 国产一区麻豆 | 天天干天天拍天天操天天拍 | 日韩字幕在线观看 | 国产久视频 | 日韩精品免费在线视频 | 国产裸体永久免费视频网站 | 亚洲精品在线观看免费 | 六月丁香综合网 | 亚洲成av人片在线观看www | 91在线视频免费91 | 亚洲久草网 | 国产精品久久久久久久久岛 | 国产中文字幕三区 | av在线电影网站 | 久久99网| 在线黄色av | 中文字幕在线观看网站 | 中文在线免费观看 | 欧美一二三区播放 | 99久久er热在这里只有精品15 | 在线观看网站你懂的 | av电影中文字幕在线观看 | aⅴ精品av导航 | 最近在线中文字幕 | 在线观看av不卡 | 色国产视频 | 色999在线| 久久伦理影院 | 日韩欧美国产成人 | 国产精品一区久久久久 | 伊人国产在线播放 | 免费99精品国产自在在线 | 欧美一级日韩免费不卡 | 五月激情五月激情 | 依人成人综合网 | 国产高清av在线播放 | 久久久香蕉视频 | 精品亚洲免费视频 | 欧美日韩在线视频一区二区 | 久久er99热精品一区二区三区 | a视频免费 | av免费网站在线观看 | 播五月婷婷 | 亚洲国产理论片 | 久久视频在线观看中文字幕 | 久久精品—区二区三区 | 天天综合久久综合 | av在线影视| 国产不卡视频在线 | 美女视频黄免费的久久 | 福利av在线 | 在线观看免费视频 | 午夜精品久久久久久久爽 | wwwww.国产| 国产资源av | 亚洲美女视频在线观看 | 欧美色图88 | 特级毛片爽www免费版 | 中文字幕乱码日本亚洲一区二区 | 免费热情视频 | 五月天av在线 | 亚洲播放一区 | 欧美成人91 | 日韩精品久久久久久中文字幕8 | 天天色天天爱天天射综合 | 国产精品一区久久久久 | 亚洲情婷婷| 91视频91自拍 | 中文字幕在线免费看 | 久久视频精品 | 欧美精品在线免费 | 亚州av一区 | 久久高清视频免费 | 日本久久综合网 | 黄色录像av| 亚洲女同ⅹxx女同tv | 中文字幕在线视频精品 | 91av色| 天天搞天天干 | 婷婷丁香久久五月婷婷 | 欧美人操人 | 1区2区3区在线观看 三级动图 | 尤物97国产精品久久精品国产 | 色资源在线观看 | 草久中文字幕 | 婷婷伊人五月 | 999久久| 国产专区视频在线 | 少妇自拍av | 日韩免| 国产无遮挡又黄又爽馒头漫画 | 亚洲色图 校园春色 | 少妇激情久久 | 制服丝袜在线 | 99免费在线播放99久久免费 | 超碰.com| 中文永久免费观看 | 久艹视频免费观看 | 色a网| 蜜臀久久99精品久久久久久网站 | 国产成人精品一区二三区 | 亚洲乱码一区 | 国产黄av| aⅴ视频在线| 夜夜视频 | 一区二区三区精品在线视频 | 黄色在线看网站 | 成人黄色中文字幕 | www免费在线观看 | 中文字幕乱码电影 | 在线播放 一区 | 欧美午夜a | 天天干天天搞天天射 | 久久精品韩国 | 国内毛片毛片 | 欧美精品在线一区二区 | 日本久久久影视 | 日韩激情免费视频 | 成人免费视频免费观看 | 国产精品第一页在线观看 | a级黄色片视频 | 亚州免费视频 | 天天综合久久综合 | 91激情视频在线播放 | 18+视频网站链接 | 日日激情 | 日韩精品一区二区三区高清免费 | 久久99亚洲精品久久 | 日本aaaa级毛片在线看 | 国产精品福利久久久 | 973理论片235影院9 | 久草电影网 | 国产成人精品久久亚洲高清不卡 | 中文字幕韩在线第一页 | 国产高清在线免费 | 欧美成人精品欧美一级乱黄 | 日韩偷拍精品 | 免费看久久久 | www在线观看国产 | 久久综合九色综合网站 | 国内少妇自拍视频一区 | 一区二区三区四区五区在线 | 国产男女免费完整视频 | 91精品久久香蕉国产线看观看 | 在线观看日本高清mv视频 | 久久这里只有精品23 | 久久五月天综合 | 精品999国产| 黄网站app在线观看免费视频 | 免费精品在线视频 | www国产亚洲 | 蜜臀久久99精品久久久久久网站 | 色av男人的天堂免费在线 | av成人黄色 | 亚在线播放中文视频 | 亚洲国产免费网站 | 欧美小视频在线观看 | 天天操福利视频 | 在线免费观看国产视频 | 天天做天天爱夜夜爽 | 免费看v片网站 | 久久久精品国产一区二区 | 97看片网 | 婷婷久久一区 | 国产精品嫩草影院123 | av在线永久免费观看 | 国产精品99爱 | 久久久久久免费视频 | 久久看免费视频 | www.久久久.cum | 中文字幕在线人 | 精品国产1区2区3区 国产欧美精品在线观看 | 激情五月婷婷综合 | av网在线观看 | 色综合网 | 久久久久久久电影 | 亚洲成a人片综合在线 | 香蕉成人在线视频 | 少妇性色午夜淫片aaaze | 久久久av电影 | 国产视频日本 | 狠狠狠干 | 黄色在线网站噜噜噜 | 国产99久久九九精品免费 | 久久久免费精品 | 九九九国产 | 久久久伊人网 | 免费观看mv大片高清 | 欧美成a人片在线观看久 | 人人爽人人爽人人爽学生一级 | 麻豆91精品91久久久 | 国产成人一区二区三区影院在线 | 成人日韩av | 久久综合导航 | 九九综合在线 | 99久久毛片 | 草久久影院 | 中文字幕乱码视频 | 免费视频网 | 久久色网站 | 黄色片网站av | 成人免费视频在线观看 | 五月婷婷爱 | 久久久久草| www免费看 | 国产一区二区三区在线 | 国产综合小视频 | 日本韩国精品一区二区在线观看 | 日韩三级视频在线看 | 国产在线毛片 | 亚州精品视频 | 天堂av在线7| 91在线视频精品 | 五月天激情在线 | 国产精品自在欧美一区 | 在线看av的网址 | 97色涩| 色中文字幕在线观看 | 成人蜜桃网| 在线看国产日韩 | 日韩中文字幕免费在线播放 | 丁香婷婷综合五月 | 国产精品美女在线观看 | 久草成人在线 | 亚洲精品久| 93久久精品日日躁夜夜躁欧美 | 久久国产精品99久久人人澡 | 中文字幕资源站 | 成人性生交大片免费观看网站 | 婷婷国产精品 | 久久久国产精品亚洲一区 | 色婷五月天 | 日日夜夜91 | 在线亚洲天堂网 | 免费网站v | 久久精品96 | 国产91粉嫩白浆在线观看 | 国产欧美综合在线观看 | 亚洲欧美成人 | 欧美韩日精品 | 日韩精品免费在线视频 | 日日夜夜婷婷 | 一区二区中文字幕在线 | 精品一区二区综合 | 国产成年免费视频 | 午夜色婷婷 | 黄色中文字幕在线 | 在线观看中文字幕网站 | 国产蜜臀av | 九九九在线观看视频 | 九色91视频| 超碰个人在线 | 国产成人亚洲精品自产在线 | 日韩av看片| 亚洲精品1234区 | 91免费版成人 | 久久综合日 | 久久99久久99久久 | 黄色一级片视频 | 日韩 在线a | 午夜视频免费在线观看 | 91最新网址在线观看 | 日韩三级视频在线看 | 91自拍成人 | 日本久久久精品视频 | 青春草视频在线播放 | 最新av网址大全 | 亚州成人av在线 | 日本性动态图 | 97在线影视 | 综合色综合 | 久久久人人爽 | 色狠狠综合天天综合综合 | 亚洲 欧洲av | 在线播放 日韩专区 | 精品国产精品久久 | av线上看 | 亚洲最新视频在线播放 | 中文字幕av在线 | 偷拍精偷拍精品欧洲亚洲网站 | 亚洲精品99| 91av国产视频 | av一级片在线观看 | 中文字幕乱视频 | 三级黄色理论片 | 亚洲情感电影大片 | 婷婷精品国产一区二区三区日韩 | 国产精品中文在线 | 欧美日韩综合在线观看 | 国产视频中文字幕在线观看 | 亚洲在线视频观看 | wwwww.国产 | 国产在线第三页 | 久久tv | 99久热精品 | 亚洲永久精品一区 | 国产精品久久久精品 | 国产美女免费看 | 激情av一区二区 | 99国产成+人+综合+亚洲 欧美 | 久久久久久久久久影院 | 麻豆精品传媒视频 | 日韩欧美黄色网址 | 色欧美视频 | 欧美日韩亚洲第一 | 精品国产aⅴ一区二区三区 在线直播av | 久久久久激情 | 九九热精品视频在线播放 | 欧美日韩国产色综合一二三四 | 精品女同一区二区三区在线观看 | 精品久久久久久亚洲综合网 | 中文字幕免费不卡视频 | 国产专区精品视频 | 91精品视频在线观看免费 | 香蕉国产91 | 久久免费福利视频 | 视频在线观看国产 | 国产69精品久久久久9999apgf | 国产精品男女啪啪 | 五月天综合激情 | 国产小视频在线免费观看视频 | 国产美女网站在线观看 | 色综合天天狠天天透天天伊人 | 免费h精品视频在线播放 | 精品一区二区久久久久久久网站 | 免费日韩一区二区三区 | 国产精品中文 | 国产一区二区免费看 | 免费在线激情电影 | 人人爽影院 | av一级网站 | 蜜臀aⅴ精品一区二区三区 久久视屏网 | 亚洲精品美女在线观看 | 午夜视频在线观看欧美 | 久久免费视频一区 | 久久黄色免费观看 | 色视频在线免费观看 | 国产精品久久久久久久久久白浆 | 人人插人人干 | 免费成人黄色片 | 国产一线二线三线性视频 | 天天伊人网 | 精品一区二区av | 九九久久免费视频 | 国产一区在线视频 | 日韩视频免费 | 国产尤物视频在线 | 亚洲色图色 | 国产精品mv | 免费av观看网站 | 97超碰在线播放 | 综合久久网站 | 亚洲精品久久久蜜臀下载官网 | 成人av影视观看 | 成人在线黄色 | 国产精品亚洲视频 | 亚洲在线资源 | 一区二区三区日韩在线观看 | 天天色.com| 丁香婷五月 | 日韩欧美视频二区 | 免费大片黄在线 | 免费网站看v片在线a | 国产成人精品在线观看 | 久久试看| 九九精品无码 | 成人cosplay福利网站 | 97香蕉视频 | 国产福利在线免费观看 | a在线一区 | 色天堂在线视频 | 亚洲激情影院 | 99视频精品视频高清免费 | 国产一级一片免费播放放 | 免费精品在线 | www婷婷| 日韩一区二区三区高清在线观看 | 欧美与欧洲交xxxx免费观看 | 99在线精品观看 | 亚洲精品国久久99热 | 久久久网站 | 国产精品永久久久久久久久久 | 黄色成人毛片 | av高清免费 | www久久com| 免费观看日韩av | 日韩啪啪小视频 | 亚洲欧美日韩一二三区 | 国产在线永久 | 免费看黄在线看 | 精品毛片一区二区免费看 | 热久久这里只有精品 | 波多野结衣一区二区三区中文字幕 | 最新中文字幕在线播放 | 美女网站久久 | 日韩免费在线观看视频 | 欧美日韩一区二区在线观看 | 久久av电影 | 美女视频a美女大全免费下载蜜臀 | 久久久久亚洲国产精品 | 久久久久一区二区三区四区 | 中文字幕九九 | 久久综合久久综合这里只有精品 | 国产在线视频资源 | 国内揄拍国产精品 | 国产欧美日韩精品一区二区免费 | 美女久久久久久久久久久 | 日本久草电影 | 91精品国产92久久久久 | 91网在线 | 福利av在线| www.国产视频 | 在线成人一区 | 99热官网| 国产精品久久久久一区二区 | 日韩电影在线观看一区二区 | 99久久精品久久久久久动态片 | 日韩视频在线观看免费 | 欧美国产日韩一区 | 五月天综合色激情 | 日韩免费成人av | 中文字幕精品一区二区三区电影 | 激情视频一区二区三区 | 福利视频网址 | 91精品视频免费看 | 亚洲精品一区二区18漫画 | 久久久久久高潮国产精品视 | 亚洲精品国内 | 激情丁香婷婷 | 天天天干天天天操 | 精品国产欧美一区二区 | 就要干b | 国产一区二区在线视频观看 | 久久国产精品一区二区三区 | 狠狠色丁香婷婷综合久小说久 | 成人毛片100免费观看 | 亚洲一区精品二人人爽久久 | 丰满少妇在线观看资源站 | 欧美日韩免费在线视频 | 国产伦精品一区二区三区免费 | 丁香亚洲 | 99视频在线精品国自产拍免费观看 | 精品不卡视频 | 99久久99久久免费精品蜜臀 | 91丨九色丨首页 | 国产精品久久久久久久久久免费看 | 成人免费在线播放视频 | 国产私拍在线 | 久久曰视频 | 亚洲欧美日韩精品久久奇米一区 | 四虎影视成人精品 | 又爽又黄又刺激的视频 | 69视频网站| 国产二区av | 久久精品视频日本 | 五月天久久 | 一区二区精品国产 | 精品久久美女 | 免费的黄色的网站 | 国产在线欧美在线 | 天天干天天综合 | 久久免费国产视频 | 五月天国产精品 | 青春草视频 | 国产视频一区二区三区在线 | 久久99九九99精品 | 97超碰免费 | 91亚洲视频在线观看 | 日韩电影一区二区三区在线观看 | 国产高清一| 久久久久久久久影视 | 久久久久久高潮国产精品视 | 国产精品久久久久免费 | 国产在线观看你懂的 | av观看免费在线 | 天天搞天天干天天色 | 在线观看视频你懂的 | 日韩av福利在线 | 国产成人精品久 | 久久久久久久久影院 | 免费看国产一级片 | 黄网站免费久久 | 欧美特一级| 欧美日韩xx | 久久视频免费观看 | 综合网五月天 | 五月激情电影 | 国产一二三在线视频 | www最近高清中文国语在线观看 | 婷婷伊人五月 | 在线看v片成人 | 久久电影国产免费久久电影 | 日韩av电影免费在线观看 | 久久久久久久影院 | 国产91精品看黄网站 | av免费观看在线 | 在线国产激情视频 | 色com| 字幕网av| 狠狠色伊人亚洲综合网站色 | 国产男女爽爽爽免费视频 | 欧美日高清视频 | 欧美日韩一级视频 | 色美女在线 | 国产91丝袜在线播放动漫 | 色视频网页 | 日韩精品一区在线观看 | 国产成人精品久久二区二区 | 中文字幕观看av | 日韩免费小视频 | 18久久久久久 | 亚洲精品视频一 | 高清不卡一区二区三区 | 最近免费观看的电影完整版 | 黄色软件在线观看免费 | 97人人模人人爽人人少妇 | av在线一级 | 亚洲精品久久在线 | 国产区精品在线观看 | 国产精品一区二区三区在线播放 | 亚洲国产免费网站 | 中文资源在线播放 | 久久97久久 | 成年人免费在线 | 四月婷婷在线观看 | 日韩电影在线观看一区二区三区 | 国产色在线,com | 午夜精品视频免费在线观看 | 日本深夜福利视频 | 69av免费视频 | 黄色av电影| av中文字幕在线电影 | 日韩r级在线| 伊人天天色| 美女久久网站 | 久久国产亚洲视频 | 天天爱天天射天天干天天 | 久热色超碰 | 久av在线 | 在线观看黄色的网站 | av免费看av | 色综合久久久久综合 | 91日韩免费| 国产精品嫩草影视久久久 | 久久久久免费网 | 午夜久久视频 | 亚州国产精品视频 | 亚洲成人精品影院 | 日韩一二区在线观看 | 久久国产精品久久w女人spa | 日韩精品一区二区在线观看 | 麻豆视频免费在线观看 | 久久久久久毛片 | 天天天天综合 | 九九热视频在线 | 国产黄色成人 | 婷婷九九| 四虎成人精品在永久免费 | 久久婷婷精品 | av在线播放免费 | 91精品一区在线观看 | 超碰人人草人人 | 国产在线观看99 | 国产精品一区二区在线 | 亚洲欧美视频在线观看 | 九九久久久久久久久激情 | 中文字幕在线色 | 中文字幕人成不卡一区 | 中文字幕在线视频网站 | 国产黄色一级片 | 国产精品理论片在线观看 | 天天操天天射天天添 | 亚洲在线视频免费观看 | 成人资源在线播放 | 成人一级片视频 | 精品在线视频一区二区三区 | 一区二区视频欧美 | 夜夜躁狠狠躁日日躁视频黑人 | 国产色黄网站 | 狠狠狠狠狠狠狠狠 | 国产色视频网站2 | 国产精品专区h在线观看 | 国产福利在线免费 | 深夜免费福利视频 | 欧美色综合 | 国产色女人 | 欧美激情精品久久久久久免费 | 欧美韩日精品 | av福利超碰网站 | 久久影院一区 | 国产区久久 | 成人黄色小说网 | 人人超碰97 | 久久精品免费观看 | 91试看| 日日爽| 欧美日韩在线视频观看 | 国产九色在线播放九色 | av中文字幕免费在线观看 | 99在线精品免费视频九九视 | 国产精品igao视频网入口 | 天天艹天天操 | 午夜精品久久久久99热app | 五月婷网站 | 亚洲一区二区三区毛片 | 在线小视频国产 | 黄色的视频网站 | 精品国产乱子伦一区二区 | 中文字幕乱码日本亚洲一区二区 | 国产精品青草综合久久久久99 | 免费成人黄色av | 婷婷色吧 | 日本中文字幕久久 | 亚洲色图 校园春色 | 国产精品第10页 | 亚洲国产精品99久久久久久久久 | 又黄又爽又无遮挡免费的网站 | 欧美精品v国产精品v日韩精品 | 天天摸天天舔天天操 | 日本特黄特色aaa大片免费 | 青青河边草免费 | 人人爽人人做 | 91经典在线| 一区二区在线不卡 | 婷婷色在线资源 | 久久99精品热在线观看 | 亚洲在线国产 | 国产区精品视频 | 久久中文网 | 久草精品国产 | 人人爽人人爽人人爽学生一级 | 精品99在线观看 | 成人免费看黄 | 午夜精品剧场 | 亚洲国产日本 | 粉嫩av一区二区三区四区在线观看 | 国产老熟 | 国产精品久久久久一区二区国产 | 天堂网在线视频 | 麻豆传媒电影在线观看 | 欧美日韩高清 | 2023国产精品自产拍在线观看 | 国产精品久久毛片 | 91毛片在线 | 一本色道久久精品 | 日韩av手机在线观看 | 色综合久久综合中文综合网 | 亚洲欧洲成人 | 中文字幕观看视频 | 久久夜av| 91中文字幕在线播放 | 国产一区二区手机在线观看 | 五月婷婷久草 | 成人动漫精品一区二区 | 国产一二三区av | 伊人国产视频 | 狠狠色丁香婷婷 | 国产1区在线观看 | 天天做天天爱天天综合网 | 在线你懂的视频 | 精品一区二区免费在线观看 | 天天操夜夜操 | 最近中文字幕第一页 | 天天av综合网 | 综合网天天 | 中文字幕一区二区三区精华液 | 国产在线视频一区二区 | 麻豆视频91 | 日本中文字幕在线免费观看 | 欧美一区在线看 | 久久综合久久综合久久综合 | 久久精品综合视频 | 成人午夜电影久久影院 | 九九视频这里只有精品 | 日韩免费电影一区二区 | 色婷婷综合久久久 | 欧美精品久久久久性色 | 国产小视频免费在线网址 | 97久久精品午夜一区二区 | 97超碰人人澡人人爱 | 玖玖在线免费视频 | 国产系列精品av | 久久久久99精品国产片 | 久久久性 | 成年人在线观看网站 | 91成人在线观看高潮 | 欧美日韩在线观看一区二区三区 | www.在线观看视频 | 丁香婷婷色综合亚洲电影 | 日韩欧美视频一区二区三区 | 久久精品一二三区 | 亚洲精品色婷婷 | 狠狠色丁香婷婷综合视频 | 伊人色**天天综合婷婷 | 婷婷色吧 | 国产精品久久电影网 | 久久精品视频免费观看 | 国产亚洲资源 | 免费在线国产精品 | 日韩成片 | 亚洲欧美日韩国产一区二区 | 97日日碰人人模人人澡分享吧 | 国产成人精品999在线观看 | 亚洲国产精品视频在线观看 | 男女精品久久 | 又黄又色又爽 | 香蕉在线影院 | 国产精品久久久久免费a∨ 欧美一级性生活片 | 色无五月 | 天天综合五月天 | 黄色成品视频 | 欧美国产在线看 | 亚洲精品国产日韩 | 91精品久久久久久综合五月天 | 91网站免费观看 | 在线激情小视频 | 看v片| 久久久久免费精品视频 | 欧美国产91 | 日韩精品视频在线免费观看 | 欧美a级免费视频 | 日韩超碰在线 | 日本久久久亚洲精品 | 免费看三级 | 97视频在线免费 | 91av在线免费看 | 九九久久国产 | 日韩色一区二区三区 | 国产精品久久久久久久午夜片 | 国产资源站 | 久久国产精品99久久久久久进口 | 日韩va欧美va亚洲va久久 | 探花系列在线 | 久久毛片高清国产 | 91免费观看视频网站 | 亚洲国产免费av | 又黄又刺激的网站 | 不卡中文字幕在线 | 日韩美女免费线视频 | 久久国产二区 | 99久高清在线观看视频99精品热在线观看视频 | 亚洲精品动漫久久久久 | 二区在线播放 | 久久久999 | 最近日本韩国中文字幕 | 久久久网页 | 一区av在线播放 | 91精品国产成人www | 午夜精品一区二区三区视频免费看 | 成人蜜桃网 | 一区二区三区在线视频111 | 五月激情丁香 | www.天天干 | 日韩av女优视频 | 香蕉视频在线网站 | 欧美黑人xxxx猛性大交 | 中文字幕视频网 | 在线观看国产中文字幕 | 国产性xxxx | 日本成人中文字幕在线观看 | 日日夜夜精品免费视频 | 九九免费精品 | 国产一级片久久 | 狂野欧美激情性xxxx欧美 | 久久国产午夜精品理论片最新版本 | 亚洲一级黄色大片 | 精品一二 | 久久看毛片 | 深爱激情五月婷婷 | 91久久精品一区二区二区 | 天天艹天天爽 | 国产精品嫩草影视久久久 | 亚洲伦理电影在线 | 97国产一区二区 | 蜜臀av性久久久久蜜臀aⅴ流畅 | 中文字幕第一页在线视频 | 日韩欧美69 | 91精品在线麻豆 | 视频一区二区国产 | 五月天激情视频 | 免费a网 | 天天操天天爽天天干 | 日韩电影在线观看中文字幕 | 欧美精品乱码久久久久 | 在线 日韩 av| 日韩r级在线 | 欧美日韩精品在线观看视频 | 我要色综合天天 | 天天添夜夜操 | 免费福利视频导航 | 97超在线 | 国产成人精品一区二区三区福利 | 色多视频在线观看 | 去干成人网 | 亚州精品在线视频 | 国产一区二区久久久 | 91丨精品丨蝌蚪丨白丝jk | 色综合色综合久久综合频道88 | 久一在线| 黄色软件在线观看 | av成人免费网站 | 国内精品久久久久久久影视麻豆 | 中文字幕免费播放 | 日韩手机在线观看 | 91电影福利 | 国产精品专区h在线观看 | 国产一区二区高清不卡 | 免费91在线观看 | 国产一二三区av | 成人中文字幕在线 | 91av短视频| 日韩综合第一页 | av电影在线播放 | av网站手机在线观看 | 成人一区二区三区在线观看 | 久久精彩| 黄色网在线免费观看 | 99视频 | 丁香综合五月 | 视频在线观看入口黄最新永久免费国产 | 欧美地下肉体性派对 | 日韩在线视频国产 | 91久久久久久久一区二区 | 国产精品一区二区三区免费看 | 亚洲精品在线一区二区三区 | 日韩在线电影观看 | 在线观看免费成人av | 亚洲久草视频 | 黄色特一级片 | 一二区精品 | 久久综合给合久久狠狠色 | 日韩三区在线 | 在线国产精品视频 | 亚洲干视频在线观看 | 久久激情五月婷婷 | 成人精品在线 | 久久涩涩网站 | 国产精品av免费在线观看 | 国产精品va最新国产精品视频 | 最近中文字幕 | 99r在线精品 | 久久96国产精品久久99漫画 | 日韩高清久久 | 久久最新视频 | 色999视频 | 最新国产精品亚洲 | 热久久免费视频精品 | 成人久久久久 | 天干啦夜天干天干在线线 | 午夜久久网 | 欧美va在线观看 | 欧美性做爰猛烈叫床潮 | 久久国产精品网站 | 成av在线| 天天综合网 天天综合色 | 不卡日韩av| 丁香免费视频 | 麻豆视频在线免费观看 | 天天搞天天 | 国产色拍拍拍拍在线精品 | 日日干美女 | 国内精品在线观看视频 | 久久免费黄色大片 | 日韩av一区在线观看 |