chenhongl

导航

 

#知识点:
1、数据请求方式-GET&POST&COOKIE等
2、常见功能点请求方式-用户登录&IP记录等
3、黑盒白盒注入测试要点-SQLMAP注入参数

#补充点:
黑盒测试:功能点分析
白盒测试:功能点分析&关键代码追踪

1.数据库注入 - access mysql mssql oracle mongodb postgresql等
2.数据类型注入 - 数字型 字符型 搜索型 加密型(base64 json)等
3.提交方式注入 - get post cookie http头等
4.查询方式注入 - 查询 增加 删除 更新 堆叠等
5.复杂注入利用 - 二次注入 dnslog注入 绕过bypass等

数据库类型决定攻击的手法 -payload不同
数据类型注入-payload考虑闭合,数据格式
提交方式-数据请求不同,注入的时候需要按照指定方式去测试,URL没有参数并不代表没有注入,有些数据会在数据包才能体现。http数据包任何一个地方只要被接受,都有可能产生漏洞


脚本不同的接受方式:
#部分语言接受代码块

(1)PHP

<?php
header("Content-Type: text/html; charset=utf-8");

$get=$_GET['g'];
$post=$_POST['p'];
$cookie=$_COOKIE['c'];
$request=$_REQUEST['r'];
$host=$_SERVER['HTTP_HOST'];//当前访问URL地址
$user_agent=$_SERVER["HTTP_USER_AGENT"];//浏览器信息
$ip=$_SERVER["HTTP_X_FORWARDED_FOR"];//8.8.8.8

echo $get."<hr>";
echo $post."<hr>";
echo $cookie."<hr>";
echo $request."<hr>";
echo $host."<hr>";
echo $user_agent."<hr>";
echo $ip;
?>

(2)Java Spring 不同框架,不同写法
method=RequestMethod.GET
method=RequestMethod.POST
request.getParameter("参数名");
可以直接获取get请求的参数key对应的value
也可以从请求体中获取参数的key对应的value

(3)Python flask  不同框架,不同写法
requests.get
requests.post
request.args.get(key)
request.form.get(key)
request.values.get(key)

 

一、数据请求方式

在WWW文件夹下创建test.php

<?php
header("Content-Type: text/html; charset=utf-8");

$get=$_GET['g'];
$post=$_POST['p'];
$cookie=$_COOKIE['c'];
$request=$_REQUEST['r'];
$host=$_SERVER['HTTP_HOST'];//当前访问URL地址
$user_agent=$_SERVER["HTTP_USER_AGENT"];//浏览器信息
$ip=$_SERVER["HTTP_X_FORWARDED_FOR"];//8.8.8.8

echo $get."<hr>";
echo $post."<hr>";
echo $cookie."<hr>";
echo $request."<hr>";
echo $host."<hr>";
echo $user_agent."<hr>";
echo $ip;
?>

 

(1)get请求

参数在URL里,就能接收到

$get=$_GET['g'];

echo $get."<hr>";

 

(2)POST请求

参数在data中才能被接收

$post=$_POST['p'];
echo $post."<hr>";

 

(3)COOKIE

参数在Cookie中才能被接收

$cookie=$_COOKIE['c'];

echo $cookie."<hr>";

 

(4)REQUEST请求

全部接收,参数在URL、data、Cookie等都能被接收

$request=$_REQUEST['r'];
echo $request."<hr>";

 

(5)SERVER

① 获取Host的值(当前访问URL地址)

$host=$_SERVER['HTTP_HOST']; //当前访问URL地址

echo $host."<hr>";

 

② 获取user_agent的值

$user_agent=$_SERVER["HTTP_USER_AGENT"];//浏览器信息

echo $user_agent."<hr>";

 

③获取X-Forwarded-For的值(IP地址)

$ip=$_SERVER["HTTP_X_FORWARDED_FOR"];//8.8.8.8

echo $ip;

 

二、不同请求方式可能存在的注入点分析

1.后台要记录操作访问IP
IP要进行代码的获取,获取之后,IP会不会记录到数据库中呢?
如果IP会写到数据库,如果IP能够自定义数据,是不是就能尝试SQL注入。

2.网站要根据访问设备给与显示页面(通过判断浏览器ua头信息)
接收访问UA信息,进行判断。
将各种UA进行数据库整理后,用户访问后对比数据库找那个的UA值来进行判断

3.网站要进行文件上传,用户登录
由于上传的文件可大可小,如果GET请求不满足,就用POST请求
用户登录,接收账号密码后进行数据库查询后对比(POST请求)

所用到的功能需要:
$host=$_SERVER['HTTP_HOST'];//当前访问URL地址
$user_agent=$_SERVER["HTTP_USER_AGENT"];//浏览器信息
$ip=$_SERVER["HTTP_X_FORWARDED_FOR"];//8.8.8.8

 

三、案例

1、实例黑盒-后台表单登陆框-POST注入 

墨者登录框测试,https://www.mozhe.cn/bug/detail/108
① 登录 抓取数据包

② 测试是否有注入点:

name=xiaodi' order by 4&password=xiaodi&login=%B5%C7%C2%BC  //页面显示错误

③ 爆数字

name=xiaodi' and 1=2 union select 1,2,3 &password=xiaodi&login=%B5%C7%C2%BC

 

用SQLmap也可以进行post注入:

1. 方式一:(推荐)
  ①将数据包复制到p.txt,注入点后用*注释

  ② 执行python sqlmap.py -r p.txt

2. 方式二:直接执行

  python sqlmap.py -u "http://219.xx.xx.xx:47456/login.php" --data "name=xiaodi&password=xiaodi"

 

2、ZZCMS-HTTP头XFF漏洞注入-IP伪造

源码:

特别是X-Forwarded-For中的IP地址是可以伪造的

手动注入:修改X-Forwarded-Fo

r

 

使用sqlmap测试:

将请求放到xff.txt

执行:pyhton sqlmap -r xff.txt

检测到注入:

 

3、实例白盒-ESPCMS-商品购买-COOKIE注入

在interface下有一个order.php文件,发现参数接受和SQL执行
参数接受:$cartid = $this->fun->accept('ecisp_order_list', 'C');
SQL执行:$sql = "SELECT did,lng,pid,mid,aid,tid,sid,fgid,linkdid,isclass,islink,ishtml,ismess,isorder,purview,recommend,tsn,title,longtitle, color,author,source,pic,link,oprice,bprice,click,addtime,template,filename,filepath FROM $db_table WHERE $db_where";


转到接收参数的函数accept中

参数接受:$cartid = $this->fun->accept('ecisp_order_list', 'C');为C,所以是cookie接收。
那么如何访问这个文件呢,这个接受参数是定义在function in_list()函数里面

//关键代码:
$archive = indexget('ac', 'R');
$action = indexget('at', 'R');
 
if (in_array($archive, array('article', 'forum', 'search', 'bbssearch', 'forummain', 'messmain', 'special', 'respond', 'public', 'scriptout', 'enquiry', 'enquirymain', 'form', 'formmain', 'ordermain', 'membermain', 'member', 'forum', 'order'))) {
		$action = 'in_' . $action;
		if (!file_exists(admin_ROOT . "interface/$archive.php")) {
			exit('Access error!');
		}
		include admin_ROOT . "interface/$archive.php";
		$mainlist = new mainpage();
		if (method_exists($mainlist, $action)) {
			$mainlist->$action();
		} else {
			exit('Access error!');
		}
	} else {
		exit('Access error!');
	}

通过get请求来控制archive的值,让他等于order,从而包含order.php文件。
让ac=order  at=list(代码已经自动加上了in_)
构造访问文件方法:127.0.0.1:8098/index.php?ac=order&at=list
但是payload有点超知识点,关于反序列化的。

代码逻辑的访问:
写代码 访问文件执行
写函数 如果不调用函数,则不能执行(访问函数执行)
那个文件调用了这个函数,或者包含这个文件

 

总结:

  数据库类型决定 - 攻击的手法,payload不一样

  数据类型注入 - payload要考虑闭合,数据格式

  提交方式 - 数据请求不同,注入需要按照指定方式去测试

  url没有参数并不代表没有注入,有些数据在数据包才有体现

  http数据包任何一个地方只要被接收,就有可能产生漏洞

 

posted on 2024-02-21 15:29  chenhongl  阅读(77)  评论(0)    收藏  举报