DDoS攻击与防御

转载自 http://www.cnblogs.com/forsaken/p/6663810.html

分布式拒绝服务攻击的精髓是,利用分布式的客户端,向服务提供者发起大量看似合法的请求,消耗或长期占用大量资源,从而达到拒绝服务的目的。
从不同的角度看,分布式拒绝服务攻击的方法有不同的分类标准。
依据消耗目标资源的不同,可分为攻击网络带宽资源、攻击系统资源和攻击应用资源三类。
依据攻击数据包发送的频率和速度来划分,又可以分为洪水攻击和慢速攻击。

1. 攻击网络带宽资源

无论是服务器的网络接口带宽,还是路由器、交换机等互联网基础设施,其数据包处理能力都是存在着事实上的上限的,当到达或通过的网络数据包数量超过了这个上限时,就会出现网络拥堵、响应缓慢的情况。
消耗网络带宽资源的DDos攻击就是根据这个原理,利用受控主机发送大量的网络数据包,占满被攻击目标的全部带宽,从而使正常的请求无法得到及时有效的响应,造成拒绝服务。

1.1 直接攻击

1.1.1 ICMP/IGMP洪水攻击

网络控制消息协议ICMP用于在TCP/IP网络中发送控制信息,因特网组管理协议IGMP用于管理因特网协议多播组成员。
攻击者使用受控主机向被攻击目标发送大量的ICMP/IGMP报文,进行洪水攻击以消耗目标的带宽资源。
这种类型的攻击出现得很早,但现在已不多见,被攻击目标可以在其网络边界直接过滤并丢弃ICMP/IGMP数据包使攻击无效。

1.1.2 UDP洪水攻击

用户数据报协议UDP是一种面向无连接的传输层协议,主要用于不要求分组顺序到达的传输目的。
利用UDP数据报文,攻击者可以发动洪水攻击,通常会分为小包和大包两种攻击方式。
小包是指64字节大小的数据包,这是以太网上传输数据帧的最小值。
在相同流量下,单包体积越小,包数量就越多。
由于交换机、路由器等网络设备需要对每一个数据包进行检查和校验,因此使用UDP小包攻击能够最有效地增大网络设备处理数据包的压力,造成处理速度的缓慢和传输延迟等拒绝服务效果。
大包是指1500字节以上的数据包,其大小超过了以太网的MTU最大传输单元,使用UDP大包攻击,能够有效地占用网络接口的传输带宽,并迫使被攻击目标在接收到UDP数据时进行分片重组,造成网络拥堵,服务响应缓慢。
UDP洪水攻击出现得很早,它完全依靠受控主机本身的网络性能,通常对攻击目标带宽资源的消耗并不太大。

1.2 反射和放大攻击

1.2.1 ACK反射攻击

在传输控制协议TCP建立连接时,首先会进行TCP三次握手。
在此过程中,当服务器端接收到客户端发来的SYN连接请求时,会对该请求进行ACK应答。
利用TCP握手的ACK应答,即可进行ACK反射攻击。
如果攻击者将SYN的源IP地址伪造成被攻击目标的IP地址,服务器的应答也就会发送给被攻击目标。
由于使用TCP协议的服务在互联网上广泛存在,攻击者可以通过受控主机向大量不同的服务器发送伪造源IP地址的SYN请求,从而使服务器响应的大量ACK应答数据涌向被攻击目标,占用目标的网络带宽资源并造成拒绝服务。
在发动ACK反射攻击时,首先需要进行扫描,获得大量的反射器地址,并分别向这些反射器发送伪造源地址的SYN请求数据。
ACK反射攻击的优点主要在于能够比较有效地隐藏攻击的来源。

1.2.2 DNS放大攻击

域名系统DNS是因特网的一项核心服务,它将域名和IP地址相互映射。DNS使用TCP/UDP 53端口通信,主要使用UDP协议。
通常,DNS响应数据包会比查询数据包大,因此攻击者利用普通的DNS查询请求就能够发动放大攻击。
在以前,对DNS查询的响应数据包被限制在512字节以内,多余的字节根据实现的不同可能会被丢弃或使用TCP协议建立连接并重传。
后来出现了DNS扩展机制EDNS0扩展了DNS数据包的结构,增加了OPT RR字段。
该字段包含了客户端能够处理的最大UDP报文大小的信息,服务端在响应DNS请求时,根据该字段的大小生成响应报文。
攻击者发送的DNS查询请求数据包大小一般为60字节左右,而查询返回结果的数据包大小通常在3000字节以上。使用该方式进行放大攻击能够达到50倍以上的放大效果。
发动DNS放大攻击需要先进行扫描,获得大量的开放DNS解析器地址,并向这些地址发送伪造源IP的查询命令来放大攻击流量。

1.2.3 NTP放大攻击

网络时间协议NTP用于使计算机与时钟源进行同步和校正,它使用UDP 123端口通信。
NTP协议的monlist请求能够获取与目标NTP服务器进行同步的最近600个客户端的IP地址等信息。
这意味着,只需要发送一个很小的请求包,就能够触发大量连续的UDP响应数据包。
使用该方式进行放大攻击能够达到700倍以上的放大效果。
发动NTP放大攻击需要先进行扫描,获得大量的NTP服务器,并向这些NTP服务器发送伪造源地址的请求来放大攻击流量。

1.2.4 SNMP放大攻击

简单网络管理协议SNMP是目前网络中应用最为广泛的网络管理协议,它使用UDP 161端口通信。
攻击者向广泛存在并开启了SNMP服务的网络设备发送GetBulk请求,使用默认通信字符串作为认证凭据,并将源IP地址伪造成攻击目标的IP地址。
设备收到GetBulk请求后,会将响应结果发送给攻击目标。当大量的响应结果涌向攻击目标时,就会导致攻击目标网络拥堵和缓慢,造成拒绝服务。
使用该方式进行放大攻击能够达到25倍以上的放大效果。
在发动SNMP放大攻击时,需要先进行扫描,获得开放SNMP协议的网络设备,虽然开放SNMP协议的网络设备很多,但是还需要猜测它们使用的默认通信字符串,因此该方式更复杂一些。

2.攻击系统资源

终端设备在与服务器进行通信时,经常需要创建会话连接,在此过程中通常会使用TCP和SSL等协议。
会话连接一旦被占满,新进入的会话请求就必须等待前面的会话完成。
消耗系统资源的DDoS攻击的主要目的就是对系统维护的连接资源进行消耗和占用,阻止正常连接的建立,从而达到拒绝服务的目的。

2.1 攻击TCP连接

2.1.1 TCP连接洪水攻击

在TCP三次握手的过程中,服务器会创建并保存TCP连接的信息到连接表中。连接表的大小是有限的,一旦服务器接收到的连接数量超过了连接表能存储的数量,服务器就无法创建新的TCP连接了。
攻击者可以利用大量受控主机,通过快速建立大量恶意的TCP连接占满被攻击目标的连接表,使目标无法接受新的TCP连接请求,从而达到拒绝服务攻击的目的。

2.1.2 SYN洪水攻击

在建立TCP连接的过程中,如果在服务器返回SYN+ACK报文后,客户端没有对其进行确认,服务器就需要重传SYN+ACK报文,并等待客户端的确认报文直到TCP连接超时。
这种等待客户端确认的连接状态通常被称为半开连接。在连接超时之前,半开连接会一直保存在服务器的连接表中。
由于连接表的大小是有限的,如果在短时间内产生大量的半开连接,而这些连接又无法很快地结束,连接表就会迅速被占满,导致新的TCP连接无法建立。
SYN洪水攻击就是攻击者利用受控主机发送大量的SYN报文,使服务器打开大量的半开连接,占满服务器的连接表,从而影响正常用户与服务器建立会话,造成拒绝服务。
这种攻击方式会很明显地暴露出攻击者的IP地址,同时响应报文会作为反射流量占用攻击者的带宽资源。
更好的方式是将SYN报文的源IP地址随机伪造成其他地址,这样攻击目标会将应答发送给伪造地址,从而占用连接资源并隐藏攻击来源。

2.1.3 PSH+ACK洪水攻击

由于带有PSH标志位的TCP数据包会强制要求接收端将接收缓冲区清空并将数据提交给应用服务进行处理,因此当攻击者利用受控主机向攻击目标发送大量的PSH+ACK数据包时,被攻击目标就会消耗大量的系统资源不断地进行接收缓冲区的清空处理,导致无法正常处理数据,从而造成拒绝服务。
单独使用PSH+ACK洪水攻击对服务器产生的影响并不十分明显,更有效的方式是SYN洪水攻击与ACK洪水攻击相结合,这样能够绕过一部分防护设备,增强攻击效果。

2.1.4 Sockstress慢速攻击

在TCP传输数据时,会将数据临时存储在接收缓冲区中,该接收缓冲区的大小是由TCP窗口表示的。
如果TCP窗口大小为0则表示接收缓冲区已满,发送端应该停止发送数据,直到接收端窗口更新。
Sockstress慢速攻击就是利用该原理长时间地维持TCP连接,以达到拒绝服务的目的。
Sockstress慢速攻击首先会完成TCP三次握手以建立TCP连接,在最后的ACK应答中,攻击者将其TCP窗口设置为0后再进行一次数据请求。
攻击目标在传输数据时,发现接收端的TCP窗口大小为0就会停止传输数据,并发出TCP窗口探测包,询问攻击者其TCP窗口是否更新。
由于攻击者没有更新TCP窗口大小,攻击目标会一直维持TCP连接等待数据发送,并不断进行窗口更新探测。
攻击目标的TCP连接表将逐渐耗尽,无法接受新的连接而导致拒绝服务。
Sockstress慢速攻击的另一种方式是将TCP窗口设置为一个非常小的值,这样攻击目标将不得不把需要发送的数据切分成大量很小的分片,这会极大地消耗目标的内存和处理器资源,造成系统响应缓慢和拒绝服务。

2.2 攻击SSL连接

2.2.1 THC SSL DoS攻击

在进行SSL数据传输之前,通信双方首先要进行SSL握手,以协商加密算法交换加密密钥,进行身份认证。
通常情况下,这样的SSL握手过程只需要进行一次即可,但是在SSL协议中有一个Renegotiation选项,通过它可以进行密钥的重新协商以建立新的密钥。
THC SSL DoS攻击就是这样反复不断地进行密钥重新协商过程,该过程需要服务器投入比客户端多15倍的CPU计算资源。
攻击者只需要一台普通PC就能够拖慢一台高性能服务器,如果有大量主机同时进行攻击,就会使服务器忙于协商密钥而完全停止响应。

2.2.2 SSL洪水攻击

在SSL握手的过程中,服务器会消耗较多的CPU计算资源对数据先进行解密再进行有效性检验。
攻击者可以利用这个特性进行SSL洪水攻击。

3.攻击应用资源

网络应用和服务在处理数据时,通常需要消耗一定的网络连接、计算和存储资源,这些资源是由应用程序向系统进行申请并自行管理和维护的。
消耗应用资源的DDoS攻击就是通过向应用提交大量消耗资源的请求,从而达到拒绝服务的目的。

3.1 攻击DNS服务

3.1.1 DNS QUERY洪水攻击

DNS QUERY洪水攻击是指向DNS服务器发送大量查询请求以达到拒绝服务效果的一种攻击方法。
在DNS解析的过程中,客户端发起一次查询请求,DNS服务器可能需要进行额外的多次查询才能完成解析的过程并给出应答,在这个过程中会消耗一定的计算和网络资源。
如果攻击者利用大量受控主机不断发送不同域名的解析请求,那么DNS服务器的缓存会被不断刷新,而大量解析请求不能命中缓存又导致DNS服务器必须消耗额外的资源进行迭代查询,这会极大地增加DNS服务器的资源消耗,导致DNS响应缓慢甚至完全拒绝服务。
进行DNS QUERY洪水攻击的要点在于每一个DNS解析请求所查询的域名应是不同的,这样可以比较有效地避开DNS服务器缓存中的解析记录,达到更好的资源消耗效果。

3.1.2 DNS NXDOMAIN洪水攻击

DNS NXDOMAIN洪水攻击是DNS QUERY洪水攻击的一个变种,它向DNS服务器查询不存在的域名。
在进行DNS NXDOMAIN洪水攻击时,DNS服务器会进行多次域名查询,其缓存会被大量NXDOMAIN记录所填满,导致响应正常用户的DNS解析请求的速度变慢。
与DNS QUERY洪水攻击所达到的效果类似。

3.2 攻击Web服务

3.2.1 HTTP洪水攻击

在处理HTTP请求的过程中,Web服务器通常需要解析请求、处理和执行服务端脚本、验证用户权限并多次访问数据库,这会消耗大量的计算资源和I/O访问资源。
如果攻击者利用大量受控主机不断地向Web服务器恶意发送大量HTTP请求,要求Web服务器处理,就会完全占用服务器的资源,造成其他正常用户的Web访问请求处理缓慢甚至得不到处理,造成拒绝服务。
由于HTTP协议是基于TCP协议的,需要完成三次握手建立TCP连接才能开始HTTP通信,因此进行HTTP洪水攻击时无法使用伪造源IP地址的方式发动攻击。
这时,攻击者通常会使用HTTP代理服务器,这样不仅可以隐藏来源以避免被追查,还能够提高攻击的效率,攻击者连接代理服务器并发送完请求后,可以直接切断与该代理服务器的连接并开始连接下一个代理服务器。
这时代理服务器与目标Web服务器的HTTP连接依然保持,Web服务器需要继续接收数据并处理HTTP请求。
Web服务也存在缓存机制,如果攻击者的大量请求都命中了服务器缓存,那么这种攻击的主要作用仅体现在消耗网络带宽资源上,对于计算和I/O资源的消耗是非常有限的。
因此,高效的HTTP洪水攻击应不断发出针对不同资源和页面的HTTP请求,并尽可能请求无法被缓存的资源,从而加重服务器的负担,增强攻击效果。

3.2.2 Slowloris慢速攻击

HTTP首部以连续的"\r\n\r\n"作为结束标志。许多Web服务器在处理HTTP请求的首部信息时,会等待首部传输结束后再进行处理。
如果Web服务器没有接收到连续的"\r\n\r\n"标志,就会一直接收数据并保持与客户端的连接。
利用这个特性,攻击者能够长时间与Web服务器保持连接,并逐渐耗尽Web服务器的连接资源,导致其他用户的HTTP请求无法被处理,造成拒绝服务。

3.2.3 POST慢速攻击

在HTTP首部信息中,可以使用Content-Length字段来指定HTTP消息实体的传输长度。
当Web服务器接收到的请求首部中含有Content-Length字段时,服务器会将该字段的值作为POST实体的长度,持续接收数据并在到达Content-Length值时对POST实体的数据内容进行处理。
攻击者在发送HTTP POST请求时,在请求首部中将Content-Length设置为一个很大的值,并将POST实体以非常缓慢的速度一个字节一个字节的向Web服务器发送。
通过间隔性地发送单字节的POST实体内容,攻击者能够确保连接不因超时而中断。
利用这个特性,攻击者能够长时间与Web服务器保持连接,并逐渐耗尽Web服务器的连接资源,导致其他用户的HTTP请求无法被处理,造成拒绝服务。

4.防御

在发生DDoS攻击的情况下,可以通过一些缓解技术来减少攻击对自身业务和服务的影响,从而在一定程度上保障业务正常运行。
缓解DDoS攻击的主要方法是对网络流量先进行稀释再进行清洗。

4.1 攻击流量的稀释

4.1.1 内容分发网络 CDN

CDN技术的初衷是提高互联网用户对网站静态资源的访问速度,由于分布式多节点的特点,它也能够对DDoS攻击的流量产生稀释的效果。
CDN在互联网范围内广泛设置多个节点作为代理缓存,并将用户的访问请求导向最近的缓存节点,以加快访问速度。
CDN使用智能DNS系统,一个域名对应一张IP地址表,当收到域名解析请求时,智能DNS会查看解析请求的来源,并给出地址表中距离请求来源最近的IP地址。
用户收到域名解析应答时,认为该CDN节点就是他请求的域名所对应的IP地址,并向该节点发起服务或资源请求。
CDN节点在收到用户的请求时,会在其存储的缓存内容中寻找用户请求的资源,如果找到,就直接将资源响应给用户,如果找不到,则作为代理服务器向源站请求资源并将结果缓存并返回给用户。
对于有大量静态资源的网站,使用CDN进行代理缓存能够大大减少源站的访问流量。
在发生DDoS攻击时,智能DNS会将来自不同位置的攻击流量分散到对应位置的CDN节点上,从而达到流量稀释的效果。
利用CDN技术只能稀释通过域名发起的DDoS攻击的流量,如果攻击者直接通过IP地址进行攻击,就不会经过智能DNS解析,也就无法稀释流量了。

4.1.2 任播 Anycast

Anycast技术是一种网络寻址和路由方法。通过使用它,多台提供特定服务的服务器可以使用相同的IP地址,客户端访问请求报文将会被IP网络路由到这一组服务器中最近的一台之上。
Anycast技术通常是通过在不同的节点处同时使用BGP协议向外声明同样的目的IP地址的方式实现的。
使用Anycast技术能够稀释DDoS攻击流量,在Anycast寻址过程中,流量会被导向最近的节点,攻击者不能对流量路径进行操控。
由于Anycast技术的高度可靠性,即使少数节点被DDoS攻击打垮,其周围客户端的请求也能够被快速地引导向其他可用的服务器,从而保证服务的高可用性。

4.2.攻击流量的清洗

4.2.1 IP信誉检查

IP信誉机制是指为互联网上的IP地址赋予一定的信誉值,那些过去或现在经常被作为僵尸主机发动DDoS攻击的IP地址会被赋予较低的信誉值。
当发生DDoS攻击时,流量清洗设备会对通过的网络流量进行IP信誉检查,优先丢弃信誉值低的IP地址所发来的数据包或建立的会话连接。
IP信誉检查的极端情况就是IP黑名单机制,如果数据包的来源存在于黑名单之中,则直接丢弃。
这种方式一般会造成较多的误报。

4.2.2 攻击特征匹配

多数情况下,发动DDoS攻击需要借助工具,为了提高发送请求的效率,攻击工具发出的数据包通常是由编写者伪造并固化到工具中的,因此一种攻击工具所发出的数据包载荷会具有一定的特征。
流量清洗设备可以将这些数据包载荷中的特征作为指纹,来识别工具所发出的攻击流量。
命中指纹特征的数据包会被丢弃。

4.2.3 速度检查与限制

一些攻击方法在数据包载荷上可能并不存在明显的特征,没有办法进行攻击特征匹配,但却在请求数据包发送的频率和速度上有着明显的异常。
这些攻击方法可以通过速度与限制来进行清洗。
例如在受到THC SSL DoS攻击时,会在同一个SSL会话中多次进行密钥协商,而正常情况下是不会这样的,因此当流量清洗设备发现SSL会话中密钥协商的次数超过了特定的值,就可以中断这个会话并将来源IP加入黑名单中。
再如受到Slowloris和POST慢速攻击时,客户端和服务器之间会以非常低的速率进行交互和数据传输,流量清洗设备在发现HTTP请求长时间没有完成传输时,就可以将会话中断。

4.2.4 TCP代理和验证

在一个TCP SYN请求到达流量清洗设备后,设备并不将它交给服务器,而是回复一个SYN+ACK响应,并等待客户端回复。
如果SYN请求来自合法用户,那么它会对SYN+ACK进行响应,这时流量清洗设备会代替用户与服务器建立TCP连接,之后合法用户和服务器之间就通过流量清洗设备进行通信。
而如果SYN请求来自攻击者,它通常不会对SYN+ACK进行响应,从而形成半开连接。流量清洗设备会暂时保留半开连接,在经过短暂超时后丢弃它。
相比于服务器,流量清洗设备对连接表进行了优化,能够处理极其庞大的连接请求,因此即使有非常多的SYN请求同时涌向清洗设备,它也能够处理。
在此过程中,服务器并没有消耗任何连接资源,因此保证了服务器的性能不受影响。

4.2.5 协议完整性验证

为了提高发送攻击请求的效率,大多数的攻击方法都只会发送攻击请求,而不接收和处理服务器的响应数据。
因此,如果能够对请求来源进行交互式验证,就可以检查请求来源协议实现的完整性。对于协议实现不完整的请求来源,通常可以丢弃其数据包。
例如对于提供HTTP服务的Web服务器,可以使用302重定向来验证请求来源是否完整实现了HTTP协议。
HTTP状态码302表示请求的资源被临时转移,并会给出一个转移后的地址。合法用户在接收到302重定向响应码后会顺着跳转地址寻找对应的资源,而攻击工具则不会进行跳转。
因此,攻击请求将会被流量清洗设备拦截并丢弃,Web服务器不会受到影响。

2.6 客户端真实性验证
一些攻击工具在开发过程中使用了第三方库,完整实现了协议交互功能。对于这些攻击工具,需要使用客户端真实性验证技术进行攻击流量清洗。
例如对于Web服务,可以通过检查客户端是否支持JavaScript来验证请求是否来自合法用户。
对于加入了JavaScript解析和执行功能的攻击工具,则需要使用验证码来进行识别。
对于无法解析JavaScript或无法识别验证码的请求,流量清洗设备可以丢弃它,从而保护Web服务器不受影响。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容