如何进行bee-box LDAP注入的靶场练习
如果说sql注入的本质是拼接字符串的话,那么一切可以注入的本质都是拼接字符串,LDAP注入作为注入的一种也不例外,更有趣一点的说它是在拼接圆括号(sql注入也拼接圆括号,但是更习惯性的是说它拼接字符串)。
在环境配置篇里面已经很详细的说了bee-box中ldap环境的配置,靶场练习篇更多的是php与ldap的连接过程,中间使用的特殊函数介绍以及圆括号拼接的一些技巧。
下面先说一下bwapp中ldap靶场的登录过程:
首先这是一个LDAP的登录界面,URL是http://192.168.3.184/bWAPP/ldap_connect.php,直接看下这个php的文件中都写了什么。
php连接LDAP函数详解
从ldap_connect.php 文件的133的代码开始看,五个变量依次是$message,$login, $password,$server,$dn。
这五个变量中第一个是么有啥用的,第二个登录ldap服务器的用户名,第三个密码,第四个服务器地址,第五个区分名(描述一条完整的LDAP路径)。
第一个if语句是清空登录LDAP的表单,第二个if语句是判断这五个变量是不是空值,这都是小事,重点是后面的这个else,从这个else里面开始看,又有了多个if和else语句,一个个来吧。
首先看第一个if之前的三个函数ldap_connect,ldap_set_option,ldap_bind,依次说明一下这三个函数的作用。
ldap_connect:用来连接ldap数据库,格式如下
$server = “localhost”
$LDAPCONN=LDAP_Connect($server)
如果$LDAPCONN的返回值为数值型当返回结果为0时连接失败,其他值时连接成功。
ldap_set_option($link_identifier ,$option , &$retval):接收三个参数
$link_identifier
ldap_connect()函数返回的LDAP连接标识符(判断LDAP是否连接成功)
$option可接收的值如下:
LDAP_OPT_DEREF(int):搜索的时候如何处理别名,取值范围如下:LDAP_DEREF_NEVER(0,默认值),LDAP_DEREF_SEARCHING(1), LDAP_DEREF_FINDING(2), LDAP_DEREF_ALWAYS(3)
LDAP_OPT_NETWORK_TIMEOUT(int):网络超时秒数,LDAP_NO_LIMIT(0,默认值)表示永不超时。
LDAP_OPT_PROTOCOL_VERSION(int):指定使用的LDAP协议版本,取值范围如下:LDAP_VERSION2(2,默认值), LDAP_VERSION3 (3)。
LDAP_OPT_REFERRALS(bool):LDAP库是否自动追随LDAP服务器返回的引用,取值范围如下:TRUE(1,默认值), FALSE(0)。
&$retval接受选项值的变量
比如bwapp中的代码:
ldap_set_option($ds,LDAP_OPT_PROTOCOL_VERSION, 3);
这句代码的意思就是说,如果ldap连接成功了,那么就指定LDAP使用的协议为版本3。(此处不必深究,都为套用格式)
ldap_bind($link_identifier,$bind_rdn,$bind_password)
$link_identifier:ldap_connect()函数返回的LDAP连接标识符(判断LDAP是否连接成功)
$bind_rdn:使用指定的rdn即登录路径比如cn=admin,dc=bwapp,dc=local
$bind_password:指定登录的密码。
ldap_search($link_identifier, $dn,$filter):LDAP目录搜索函数,成功返回一个结果集的资源描述符,通常被其他函数以$result_identifier引用,失败返回FALSE。
$link_identifier:ldap_connect()函数返回的LDAP连接标识符(判断是否连接成功)
$dn:将要被搜索的目录的DN
$filter:搜索过滤器。比如"(objectClass=*)"表示搜索所有条目(对于read函数则表示所有属性)。
bwapp中的源码:ldap_search($ds, $dn,$filter),其中$ds=ldap_connect(),
$dn=”DC=bwapp,DC=local”,$filter=(cn=*)(即所有范围的cn),这三个参数说明ldap_search函数说明查询的是当前服务器的所有目录(相对于bwapp来说)。
ldap_count_entries($link_identifier,$search):返回查询的结果的数量
$link_identifier:dap_connect()函数返回的LDAP连接标识符(判断是否连接成功)
$search:= ldap_search($link_identifier, $dn, $filter)返回查询的结果集。
此时函数已经分析的差不多了,让我们捋一下这个连接文件的大概思路。
从149行至163行,代码都是判断得到的各种值是不是为空,如果为空,抛出提示信息。
从第165行到198行是判断登录是否成功的,其中165行到184行是判断存不存在ldap服务,187行到198行是判断是否存在区分名(相当于数据库名)。
从200行到236行是判断是否存在相应的dn,即是否存在相应的ldap路径,如果不存在,抛出相应的提示信息,如果存在调用ldapi.php,即ldap查询。在ldapi中得到查询结果后输出为表格。
LDAP查询结果的php文件介绍
输出表格的地方在ldapi.php文件中,接下来看ldapi.php中的代码。
直接从第231行开始看,从第231行到第240行都是上文中说过的,绑定LDAP目录,代码如下,不懂的可以看看上文中的LDAP绑定的部分
如果绑定成功LDAP目录的话,开始进行查询,查询的代码从242行开始
从接收POST参数user的值到,建立别名($search_field_1, $search_field_2,$search_field_3),规定过滤器($filter)(过滤器就是一个查询语句,类似于sql语句),语法规则如下:
运算符 | 字符 | 用途 |
---|---|---|
等号 | = | 创建一个要求某一字段必须拥有给定值的过滤器。 |
任何 | * | 代表可以等于除 NULL 以外任何值的字段。 |
括号 | ( ) | 分离过滤器,以让其他逻辑运算符发挥作用。 |
与 | & | 结合过滤器。相应系列的所有条件都必须为真。 |
或 | | | 结合过滤器。相应系列中必须至少有一个条件为真。 |
非 | ! | 排除符合过滤条件的所有对象。 |
返回可能会造成加载问题的所有对象:
objectClass=*
返回被指定为“person”的所有用户对象:
(&(objectClass=user)(objectCategory=person))
仅返回邮寄名单:
(objectCategory=group)
仅返回公开的文件夹:
(objectCategory=publicfolder)
返回所有用户对象,但排除主电子邮件地址已“test”开头的用户对象:
(&(&(objectClass=user)(objectCategory=person))(!(mail=test*)))
返回所有用户对象,但排除主电子邮件地址以“test”结尾的用户对象:
(&(&(objectClass=user)(objectCategory=person))(!(mail=*test)))
返回所有用户对象,但排除主电子邮件地址中包含字词“test”的用户对象:
(&(&(objectClass=user)(objectCategory=person))(!(mail=*test*)))
返回所有被指定为“person”,且属于某个群组或分配列表的所有用户对象和别名对象:
(|(&(objectClass=user)(objectCategory=person))(objectCategory=group))
返回所有被指定为“person”的用户对象、所有群组对象,以及所有联系人,但排除任意值被定义为“extensionAttribute9”的对象:
(&(|(|(&(objectClass=user)(objectCategory=person))(objectCategory=group))(objectClass=contact))(!(extensionAttribute9=*)))
返回所有 DN (CN=GRoup,OU=Users,DC=Domain,DC) 识别为群组成员的用户:
(&(objectClass=user)(objectCategory=person)(memberof=CN=Group,CN=Users,DC=Domain,DC=com))
返回所有用户:
Microsoft®Active Directory® LDAP 服务器:(&(objectCategory=person)(objectClass=user))
OpenLDAP™ 服务器:(objectClass=inetOrgPerson)
IBM® Notes®Domino LDAP 服务器:(objectClass=dominoPerson)
在 IBM Notes Domino LDAP 中搜索邮件地址被定义为“person”或“group”的所有对象:
(&(|(objectClass=dominoPerson)(objectClass=dominoGroup)(objectClass=dominoServerMailInDatabase))(mail=*))
ActiveDirectory:返回所有拥有电子邮件地址的有效(未停用)用户:
(&(objectCategory=person)(objectClass=user)(mail=*)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))
返回所有群组 DN 识别为 Group_1 或Group_2 成员的用户。
(&(objectClass=user)(objectCategory=person)(|(memberof=CN=Group_1,cn=Users,DC=Domain,DC=com)(memberof=CN=Group_2,cn=Users,DC=Domain,DC=com)))
返回 extensionAttribute1 值为“Engineering”或“Sales”的所有用户
(&(objectCategory=user)(|(extensionAttribute1=Engineering)(extensionAttribute1=Sales)))
语法规则介绍完毕,接着分析从267开始的代码
$ldap_fields_to_find定义一个数组,便于打印输出表格,和接收ldap查询到的结果,将$ldap_fields_to_find作为ldap_search函数的第四个参数,表示用这个别名保存接收到的结果,即键值对形式,接着将结果返回到$info这个数组中,最后将各个键对应到从287行到291行的各个变量,最后循环输出,打印表格,至此,查询完毕。
LDAP注入拼接语法的简单介绍
既然LDAP过滤器类似于sql查询语句,那么直接看bwapp中的过滤器如何写就行了。直接看ldapi.php文件中的$filter变量:
$filter="(|($search_field_1=$search_for)($search_field_2=$search_for)($search_field_3=$search_for))";
sql语句的精髓在于拼接单引号,ldap语句的精髓在于拼接括号。
现在我想要查询所有的用户,直接在user处输入*就行,那么$filter就会变成$filter="(|($search_field_1=*)($search_field_2=*)($search_field_3=*))";
看一下bwapp中的结果
返回了很多用户但是不够,因为我想看到我的管理员,那么我就要构造这样的LDAP过滤器。
$filter="(|($search_field_1=*)(objectclass=*)($search_field_2=*)($search_field_3=*))";
这样我就能查询所有的用户,包括管理员,objectclass=*的意思就是只要存在就搜索,即全局。
那么在user处输入*)(objectclass=*就行
看下结果,出现了管理员,注入成功。
以上是如何进行bee-box LDAP注入的靶场练习的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

1、LDAP注入LDAP(LightDirectoryAccessPortocol)是基于X.500标准的轻量级目录访问协议,提供访问目录数据库方法的服务和协议,常用于与目录数据库组成目录服务。其中目录是一个为查询、浏览和搜索而优化的专业分布式数据库,它呈树状结构组织数据,类似于Linux/Unix系统中的文件目录。公用证书、安全密钥、公司的物理设备信息等修改并不频繁的数据适合存储在目录中。可以将LDAP理解为一种搜索协议,它类似于SQL,拥有查询语法,也存在被注入攻击的风险。LDAP注入是指客

如果说sql注入的本质是拼接字符串的话,那么一切可以注入的本质都是拼接字符串,LDAP注入作为注入的一种也不例外,更有趣一点的说它是在拼接圆括号(sql注入也拼接圆括号,但是更习惯性的是说它拼接字符串)。在环境配置篇里面已经很详细的说了bee-box中ldap环境的配置,靶场练习篇更多的是php与ldap的连接过程,中间使用的特殊函数介绍以及圆括号拼接的一些技巧。下面先说一下bwapp中ldap靶场的登录过程:首先这是一个LDAP的登录界面,URL是http://192.168.3.184/bW

一、综述按照我的学习过程来说,我必须知道我进行web攻击的这个模型和漏洞的原理是什么,现在我就碰到个冷门,最初见到LDAP时是某次在某国企的渗透测试中发现一个冷门(经过授权的),激起了我对它的兴趣。LDAP的概念:全称:轻量级目录访问协议(LightweightDirectoryAccessProtocolt),特点:协议什么的就不说了,太深奥,可以把它理解为一种存储数据的数据库,它的特殊在于它是一种树状的数据库,首先这个数据库的名字相当于树根(即DB=dc),然后从树根到某个叶子节点过程所经过

在使用PHP开发Web应用程序时,我们经常需要使用LDAP身份验证来保护应用程序的访问。然而,在有些情况下,当我们尝试使用PHP的LDAP功能来实现身份验证时,可能会遇到以下错误消息:"PHPFatalerror:Calltoundefinedfunctionldap_bind()"。这种错误消息通常会在应用程序调用ldap_bind()函数

随着网络安全漏洞增多,LDAP注入攻击已经成为了很多网站面临的安全隐患。为了保护网站安全,防范LDAP注入攻击,需要使用一些安全措施。其中,Nginx作为一个高性能的Web服务器和反向代理服务器,可以为我们提供很多便利和保护。这篇文章将介绍如何使用Nginx防范LDAP注入攻击。LDAP注入攻击LDAP注入攻击是一种针对LDAP数据库的攻击方式,攻击者通过在

LDAP(LightweightDirectoryAccessProtocol)是一种用于访问分布式目录服务的协议。它可以用于进行用户身份验证、授权、帐户维护和数据存储等任务。在PHP应用程序中,LDAP可以作为一种强大的认证机制,可以为应用程序提供强大的认证和授权功能。本文将介绍在PHP中使用LDAP进行用户身份验证的方法,具体内容包括:安装和配置L

随着网络安全问题越来越受到重视,越来越多的程序员开始关注和学习如何防止代码被攻击。其中,常见的攻击方式包括SQL注入、XSS、CSRF等。但是,还有一种常见的攻击方式被低估了:LDAP注入漏洞。本文将会介绍这种攻击方式的原理和如何使用PHP防范LDAP注入漏洞。LDAP介绍LDAP(LightweightDirectoryAccessProtocol)

随着企业规模和业务需求的不断扩大,用户组管理和授权成为了一个必不可少的部分。LDAP(轻型目录访问协议)作为一种广泛应用于企业网络中的目录服务协议,为实现用户组管理和授权提供了一种高效方式。本文将介绍如何使用PHP和LDAP实现用户组管理和授权。一、什么是LDAPLDAP是一种轻型目录访问协议,广泛应用于企业网络中的目录服务协议。LDAP是基于客户端/服务器
