通用request网络请求仅支持采用https,处理请求的接口位于com.tencent.mm.plugin.appbrand.g.c中,包含url校验、域名校验、发起请求和处理响应结果。
Https校验采用类似浏览器的策略,通过系统原生的URL.openConnection()方式请求,证书校验的策略为校验公钥证书的根证书是否在合法CA列表凭证中。因此自签名证书无法使用;针对特定终端设备,即是校验公钥证书的根证书是否在受信任的凭据中,在设备被恶意安装代理根证书的前提下,存在被中间人攻击的风险。
渗透爬虫软件 资源采集 劫持域名 提取抓料子 六合·色站·彩票·博彩·金融 接渗透拿站,各大网站数据-拖库-提权联系 域名劫持 DNS 入侵网站 联系:@hacker_HouZiM
Https校验采用类似浏览器的策略,通过系统原生的URL.openConnection()方式请求,证书校验的策略为校验公钥证书的根证书是否在合法CA列表凭证中。因此自签名证书无法使用;针对特定终端设备,即是校验公钥证书的根证书是否在受信任的凭据中,在设备被恶意安装代理根证书的前提下,存在被中间人攻击的风险。
渗透爬虫软件 资源采集 劫持域名 提取抓料子 六合·色站·彩票·博彩·金融 接渗透拿站,各大网站数据-拖库-提权联系 域名劫持 DNS 入侵网站 联系:@hacker_HouZiM
❤2👍1
mobile/guestbook.php 中将
而据我对destoon的了解,其全局对GPC做了转义和WAF,但User-Agent没有进行过滤,所以这里有可能存在一个SQL注入漏洞。
所以往后看看吧,其调用了guestbook类的add方法,将
这里调用了
content 有如下过程:
title 有如下过程:
先看content,因为destoon中的htmlspecialchars是设置了
紧跟其后的title,又是从content中截取了三十个字符(令
最后执行的SQL语句如下:
渗透爬虫软件 资源采集 劫持域名 提取抓料子 六合·色站·彩票·博彩·金融 接渗透拿站,各大网站数据-拖库-提权联系 域名劫持 DNS 入侵网站 联系:@hacker_HouZiM
$_SERVER['HTTP_USER_AGENT']删掉了。分析一下,这里是手机端的留言板,destoon将用户的User-Agent放入了留言内容变量$post[content]中。而据我对destoon的了解,其全局对GPC做了转义和WAF,但User-Agent没有进行过滤,所以这里有可能存在一个SQL注入漏洞。
所以往后看看吧,其调用了guestbook类的add方法,将
$post变量传入:这里调用了
$this->set($post)进行处理,跟进:content 有如下过程:
strip_tags -> htmlspecialchars -> trimtitle 有如下过程:
in_array($post['type'], $TYPE) ? '['.$post['type'].']' : '' -> substr($post['content'], 30) -> addslashes -> trim先看content,因为destoon中的htmlspecialchars是设置了
ENT_QUOTES参数的,所以单引号也被转义了,我们无法直接逃逸出单引号,但因为\没有转义,所以我们可以利用content来消灭掉一个单引号。紧跟其后的title,又是从content中截取了三十个字符(令
$post['type']为空),所以我们大概可以构造出这样一个content: ,user(),0,0,0,0,0,0,2);...\最后执行的SQL语句如下:
渗透爬虫软件 资源采集 劫持域名 提取抓料子 六合·色站·彩票·博彩·金融 接渗透拿站,各大网站数据-拖库-提权联系 域名劫持 DNS 入侵网站 联系:@hacker_HouZiM
❤2👍1
HTML5标准中加入了对于
其他常见的自动填充的使用场景还包括电话号码、邮箱地址、即时通信账户等,完整的自动填充标识声明规范为:
其中
最后,我们来看下自动填充在笔者电脑上的现实效果:
渗透爬虫软件 资源采集 劫持域名 提取抓料子 六合·色站·彩票·博彩·金融 接渗透拿站,各大网站数据-拖库-提权联系 域名劫持 DNS 入侵网站 联系:@hacker_HouZiM
autocomplete属性的支持,以协调浏览器对于表单域的识别。最初autocomplete属性仅支持on与off两种取值,默认情况下是会启动自动填充功能以方便浏览器会将用户提交过的表单值记录下来以便复用。后续HTML标准中允许加入更多的标识值,这些标识值会更加精确地告诉浏览器应将哪些记录值对应到哪些表单。譬如我们经常需要在网页上填写地址信息,如果我们希望浏览器能够记录下常用地址信息并且自动补全,那么可以使用如下声明方式:其他常见的自动填充的使用场景还包括电话号码、邮箱地址、即时通信账户等,完整的自动填充标识声明规范为:
[section-](optional) [shipping|billing](optional) [home|work|mobile|fax|pager](optional) [autofill field name]
其中
[home|work|mobile|fax|pager]仅被用于电话、邮箱等场景。而完整的应用场景譬如是填写收货地址的收件人电话时:<label for="foo">Mobile phone for delivery</label>
<input type="text" name="foo" id="foo" autocomplete="section-red shipping mobile tel">
最后,我们来看下自动填充在笔者电脑上的现实效果:
渗透爬虫软件 资源采集 劫持域名 提取抓料子 六合·色站·彩票·博彩·金融 接渗透拿站,各大网站数据-拖库-提权联系 域名劫持 DNS 入侵网站 联系:@hacker_HouZiM
❤1👍1
这里的第一个containsAll方法是触发不了的那个函数的,所以我们只要满足对象o是JSONArray就行了,但是事实上是不行了,因为这个对象o不是Set的子类,所以这条路到这基本上就走不通了,所以我们还得继续找。
继续回到c.containsAll这个地方我们再找那些函数最终调用了containsAll,这里我们发现org.apache.commons.collections.collection.AbstractCollectionDecorator.containsAll(Collection)这个抽象类调用了,来看改函数的定义
这里最终会调用collection.containsAll方法,如果这里我们将collection赋值为JSONArray对象的话不照样触发漏洞么,由于AbstractCollectionDecorator这个类是抽象的,无法实例化,所以我们得找一个它的子类,注意这里我们必须得满足子类是实现了Set接口并且是可以序列化的,所以找到最后我们找到了org.apache.commons.collections.set.ListOrderedSet这个类。这里只需要满足父类的collection是JSONArray就行了。
到这里我们知道了只需要让equals方法中的对象o赋值成org.apache.commons.collections.set.ListOrderedSet的实例就行了。
接下来我们要去找关于equals的调用关系了,直接使用eclipse我们可以找到org.apache.commons.collections.map.Flat3Map.put(Object, Object)这个类
这个类在反序列化的时候恰好就触发了这个put函数,最终触发我们精心构造的对象。
这个Flat3Map有个特点就是当map的元素小于等于3的时候会用类成员变量来存储数据,而且这里还必须得调用equals方法。
一个是ListOrderedSet一个是concurrentSkipListSet对象,但是这里我们需要满足这两个对象的key值的hashcode必须相同。
这里的hashcode要么全为0这样是最好的,也就是key为空字符串就行了,但是我们要构造的Payload里面必须要有JSONArray对象,这个对象默认的hashcode是29,不管怎么弄都不可能相等,不过这里我们可以用hashcode碰撞来解决hashcode值相同问题。
渗透爬虫软件 资源采集 劫持域名 提取抓料子 六合·色站·彩票·博彩·金融 接渗透拿站,各大网站数据-拖库-提权联系 域名劫持 DNS 入侵网站 联系:@hacker_HouZiM
继续回到c.containsAll这个地方我们再找那些函数最终调用了containsAll,这里我们发现org.apache.commons.collections.collection.AbstractCollectionDecorator.containsAll(Collection)这个抽象类调用了,来看改函数的定义
protected Collection collection;
....
public boolean containsAll(Collection coll) {
return collection.containsAll(coll);
}
这里最终会调用collection.containsAll方法,如果这里我们将collection赋值为JSONArray对象的话不照样触发漏洞么,由于AbstractCollectionDecorator这个类是抽象的,无法实例化,所以我们得找一个它的子类,注意这里我们必须得满足子类是实现了Set接口并且是可以序列化的,所以找到最后我们找到了org.apache.commons.collections.set.ListOrderedSet这个类。这里只需要满足父类的collection是JSONArray就行了。
到这里我们知道了只需要让equals方法中的对象o赋值成org.apache.commons.collections.set.ListOrderedSet的实例就行了。
接下来我们要去找关于equals的调用关系了,直接使用eclipse我们可以找到org.apache.commons.collections.map.Flat3Map.put(Object, Object)这个类
这个类在反序列化的时候恰好就触发了这个put函数,最终触发我们精心构造的对象。
这个Flat3Map有个特点就是当map的元素小于等于3的时候会用类成员变量来存储数据,而且这里还必须得调用equals方法。
一个是ListOrderedSet一个是concurrentSkipListSet对象,但是这里我们需要满足这两个对象的key值的hashcode必须相同。
这里的hashcode要么全为0这样是最好的,也就是key为空字符串就行了,但是我们要构造的Payload里面必须要有JSONArray对象,这个对象默认的hashcode是29,不管怎么弄都不可能相等,不过这里我们可以用hashcode碰撞来解决hashcode值相同问题。
渗透爬虫软件 资源采集 劫持域名 提取抓料子 六合·色站·彩票·博彩·金融 接渗透拿站,各大网站数据-拖库-提权联系 域名劫持 DNS 入侵网站 联系:@hacker_HouZiM
❤1👍1
该段代码使用jndi的方式去访问LDAP服务,这里我们可以控制Context.PROVIDER_URL的参数,从而控制jndi访问的LDAP服务器的地址。
getSchema(rdn)方法最终会调用com.sun.jndi.ldap.LdapBindingEnumeration.createItem(String, Attributes, Vector)方法(调用关系太多,自己去调试)
在该方法中最终会调用Obj.decodeObject(attrs)方法,从而实现对象的反序列化。这里稍微提下,com.sun.jndi.ldap.Obj对象中定义了几种对象序列化与反序列化的方法,有直接反序列化的,也有直接通过远程加载的,这里的的反序列化稍微与其它地方的反序列化不同的点在于我们不能远程加载对象,因为com.sun.jndi.ldap.VersionHelper12.trustURLCodebase的默认值为false,所以直接决定了类加载器只能加载当前classpath下面的类,关于如何去构造对象使得LDAP在反序列化能执行任意代码,请看下文。
到这里我们知道了com.sun.jndi.ldap.LdapAttribute中相关的方法能触发反序列化的漏洞,那么现在我们要做的就是去找到一个类在反序列化的时候能调用我们相应触发漏洞的函数,也就是在反序列化时能调用getAttributeSyntaxDefinition方法或者getAttributeDefinition方法的类,通过老外的PPT以及公开的gadgets,我们稍微分析下就会发现在net.sf.json这个类库中存在可以调用类任意getXXX函数的地方,那么com.sun.jndi.ldap.LdapAttribute这个类中的getXXX方法是不是也可以通过这种方式来调用,首先我们先确定究竟是那个类中的那个方法能调用getXXX函数,通过gadgets中的json Payload我们发现最终能调用对象的getXXX函数
圈起来的两个地方就是能调用getXXX函数的地方,这里会先遍历javabean的所有属性,最后在挨个的调用。
弄明白了能函数调用的根源,下一步就是去找这个函数究竟会怎样触发。通过eclipse我们可以很容易发现如下调用方式。
我们可以看见defaultBeanProcessing方法最终会被ConcurrentSkipListSet类中的equals方法调用,到这里很多人可能会问了,那么多调用关系,你为什么就找这个类的equals方法,这里可能会有一些经验在里面,因为对于和equals方法相关的东西太多了,对于java中的某些数据结构,例如Set,每次添加元素的时候都会判断当前key是否存在,还有就是比较两个对象是否相等的时候会去调用hashcode和equals方法,这里如果了解过其它反序列化的同学对此可能会稍有感触,例如jdk的那个反序列化的触发过程。如果这种经验没有的话,那么你只能一个一个的去找了。
最终我们找到了一个类可以的某个方法可以调用我们的函数了,但是你可能会发现在eclipse中这样的函数调用关系大多是多态情况下的方法调用,所以我们还需要对equals方法中的方法调用进行分析,这里我们需要注意的是defaultBeanProcessing这个函数的直接调用对象是net.sf.json.JSONArray.fromObject(Object, JsonConfig)方法,我们来看下equals方法
渗透爬虫软件 资源采集 劫持域名 提取抓料子 六合·色站·彩票·博彩·金融 接渗透拿站,各大网站数据-拖库-提权联系 域名劫持 DNS 入侵网站 联系:@hacker_HouZiM
getSchema(rdn)方法最终会调用com.sun.jndi.ldap.LdapBindingEnumeration.createItem(String, Attributes, Vector)方法(调用关系太多,自己去调试)
在该方法中最终会调用Obj.decodeObject(attrs)方法,从而实现对象的反序列化。这里稍微提下,com.sun.jndi.ldap.Obj对象中定义了几种对象序列化与反序列化的方法,有直接反序列化的,也有直接通过远程加载的,这里的的反序列化稍微与其它地方的反序列化不同的点在于我们不能远程加载对象,因为com.sun.jndi.ldap.VersionHelper12.trustURLCodebase的默认值为false,所以直接决定了类加载器只能加载当前classpath下面的类,关于如何去构造对象使得LDAP在反序列化能执行任意代码,请看下文。
到这里我们知道了com.sun.jndi.ldap.LdapAttribute中相关的方法能触发反序列化的漏洞,那么现在我们要做的就是去找到一个类在反序列化的时候能调用我们相应触发漏洞的函数,也就是在反序列化时能调用getAttributeSyntaxDefinition方法或者getAttributeDefinition方法的类,通过老外的PPT以及公开的gadgets,我们稍微分析下就会发现在net.sf.json这个类库中存在可以调用类任意getXXX函数的地方,那么com.sun.jndi.ldap.LdapAttribute这个类中的getXXX方法是不是也可以通过这种方式来调用,首先我们先确定究竟是那个类中的那个方法能调用getXXX函数,通过gadgets中的json Payload我们发现最终能调用对象的getXXX函数
圈起来的两个地方就是能调用getXXX函数的地方,这里会先遍历javabean的所有属性,最后在挨个的调用。
弄明白了能函数调用的根源,下一步就是去找这个函数究竟会怎样触发。通过eclipse我们可以很容易发现如下调用方式。
我们可以看见defaultBeanProcessing方法最终会被ConcurrentSkipListSet类中的equals方法调用,到这里很多人可能会问了,那么多调用关系,你为什么就找这个类的equals方法,这里可能会有一些经验在里面,因为对于和equals方法相关的东西太多了,对于java中的某些数据结构,例如Set,每次添加元素的时候都会判断当前key是否存在,还有就是比较两个对象是否相等的时候会去调用hashcode和equals方法,这里如果了解过其它反序列化的同学对此可能会稍有感触,例如jdk的那个反序列化的触发过程。如果这种经验没有的话,那么你只能一个一个的去找了。
最终我们找到了一个类可以的某个方法可以调用我们的函数了,但是你可能会发现在eclipse中这样的函数调用关系大多是多态情况下的方法调用,所以我们还需要对equals方法中的方法调用进行分析,这里我们需要注意的是defaultBeanProcessing这个函数的直接调用对象是net.sf.json.JSONArray.fromObject(Object, JsonConfig)方法,我们来看下equals方法
渗透爬虫软件 资源采集 劫持域名 提取抓料子 六合·色站·彩票·博彩·金融 接渗透拿站,各大网站数据-拖库-提权联系 域名劫持 DNS 入侵网站 联系:@hacker_HouZiM
从get请求中获取了orderfield赋值给$orderfield并且只使用trim()函数进行了处理,这里明显是有问题的。
继续往下跟进发现传进了fetch_by_get函数的第3个参数:
继续跟进fetch_by_get函数,文件路径在:/Users/striker/www/discuz3/upload/source/plugin/jameson_read/table/table_jamesonread_books.php第120行:
发现将$orderfield直接传入了Discuz自带的DB::fetch_all函数中执行,我们继续跟进fetch_all函数:
这个函数将sql语句又传入到self::query函数:
这个函数又调用了self::format()进行格式化语句:
这个函数首先判断了%出现的次数,如果没有出现则扔出错误。
然后写两个一个while循环来拼接sql语句,查找百分号后面的字母,我们这里的$orderfield传入时是%i所以我们只关注这个分支:
如果百分号后面是i的话,就直接拼接带入进去,没有进行其他的处理。
最终format函数返回了拼接后的sql语句。
渗透爬虫软件 资源采集 劫持域名 提取抓料子 六合·色站·彩票·博彩·金融 接渗透拿站,各大网站数据-拖库-提权联系 域名劫持 DNS 入侵网站 联系:@hacker_HouZiM
继续往下跟进发现传进了fetch_by_get函数的第3个参数:
继续跟进fetch_by_get函数,文件路径在:/Users/striker/www/discuz3/upload/source/plugin/jameson_read/table/table_jamesonread_books.php第120行:
发现将$orderfield直接传入了Discuz自带的DB::fetch_all函数中执行,我们继续跟进fetch_all函数:
这个函数将sql语句又传入到self::query函数:
这个函数又调用了self::format()进行格式化语句:
这个函数首先判断了%出现的次数,如果没有出现则扔出错误。
然后写两个一个while循环来拼接sql语句,查找百分号后面的字母,我们这里的$orderfield传入时是%i所以我们只关注这个分支:
如果百分号后面是i的话,就直接拼接带入进去,没有进行其他的处理。
最终format函数返回了拼接后的sql语句。
渗透爬虫软件 资源采集 劫持域名 提取抓料子 六合·色站·彩票·博彩·金融 接渗透拿站,各大网站数据-拖库-提权联系 域名劫持 DNS 入侵网站 联系:@hacker_HouZiM
用户名可以由 128 个 ASCII 字符中的任意一个组成,但不能是
使用 SMTP 而不是 FTP。请注意,由于历史原因,这两种协议在结构上非常相似。例如,连接时,它们都会发送一个包含 220 代码和文本的回复:
因此,如果我们
使用此 URL 连接时
从 Java 的角度来看,“FTP”连接失败
渗透爬虫软件 资源采集 劫持域名 提取抓料子 六合·色站·彩票·博彩·金融 接渗透拿站,各大网站数据-拖库-提权联系 域名劫持 DNS 入侵网站 联系:@hacker_HouZiM
\<CR>或 `\ <LF>`。你猜 JRE 的实现者们忘记了什么?没错,就是检查 `\ <CR>` 或 `\`是否存在<LF>。这意味着,如果我们%0D%0A在 URL 的用户名部分(或者密码部分)的任何地方输入 `\`,我们就可以终止 `USER`(或 `PASS`)命令,并将一个新的命令注入到 FTP 会话中。使用 SMTP 而不是 FTP。请注意,由于历史原因,这两种协议在结构上非常相似。例如,连接时,它们都会发送一个包含 220 代码和文本的回复:
因此,如果我们
USER向邮件服务器而不是 FTP 服务器发送命令,它会返回一个错误代码(因为USER这不是有效的 SMTP 命令),但允许我们继续会话。结合上面提到的漏洞,这使我们能够发送任意 SMTP 命令,从而发送电子邮件。例如,让我们将 URL 设置为以下内容:使用此 URL 连接时
sun.net.ftp.impl.FtpClient,以下命令将发送到 shiftordie.de 的邮件服务器:从 Java 的角度来看,“FTP”连接失败
sun.net.ftp.FtpLoginException: Invalid username/password,但邮件已经发送出去了。渗透爬虫软件 资源采集 劫持域名 提取抓料子 六合·色站·彩票·博彩·金融 接渗透拿站,各大网站数据-拖库-提权联系 域名劫持 DNS 入侵网站 联系:@hacker_HouZiM