第28天:WEB攻防-通用漏洞&SQL注入&HTTP头XFF&COOKIE&POST请求

1645163632019-cb7f7b44-490d-4a9e-b88d-095fcaa10966.png

#知识点:
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数据包任何一个地方只要被接受,都有可能产生漏洞


脚本不同的接受方式:
#部分语言接受代码块
<?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;
?>

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

Python flask 不同框架,不同写法
requests.get
requests.post
request.args.get(key)
request.form.get(key)
request.values.get(key)
  • GET&POST&COOKIE&SERVER

GET

$get=$_GET['g'];
echo $get."<hr>";

1645166884030-699c7011-f0ac-45bb-a437-fd23c4c33938.png

POST

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

1645167180915-2786a0cf-887c-4e75-be6f-e7b6978050ff.png

COOKIE

$cookie=$_COOKIE['c'];
echo $cookie."<hr>";

1645167312724-9555f6d3-26d8-4cd8-ae25-6cc91791e1bb.png

SERVER

$request=$_REQUEST['r'];
echo $request."<hr>";
全部请求都接受

1645167406859-e904fe99-bf0c-4048-8fcd-333107796d42.png

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

  • 实例黑盒-后台表单登陆框-POST注入
墨者登录框,登录 抓取数据包

1645169887160-25f8838e-ed7d-4ee1-83d0-d3ccb69c3fd1.png

测试是否有注入点:name=xiaodi' and 1=2&password=xiaodi&login=%B5%C7%C2%BC

1645170126773-b9cd8507-1a3a-4931-93eb-997983044c3c.png

很容易看出,这个登录框是没有注入点的。
SQLmap也可以进行post注入:
1.用数据包进行测试,注入地方*注释(推荐)
2.--data "name=xiaodi&password=xiaodi"

  • 实例白盒-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";

1645179823211-4194de26-d974-424e-af40-183bb89b190b.png

转到接收参数的函数accept中

1645179988208-7661cf88-07a0-432c-bbf1-5cc3c00518a8.png

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

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

1645180371119-9bfc1f59-84ff-4bca-947f-1471deadcc17.png

但是发现都没有调用in_list()的地方
接下来打开index.php文件

1645180626548-4e091945-29e5-47d6-a0c3-1865a031ec8d.png

定位indexget函数,发现也是接受函数。继续往下面,发现包含函数include admin_ROOT . "interface/$archive.php";
让$archive.php=order.php,控制$archive的值

生成新对象:$mainlist = new mainpage();
in_list()刚好在mainpage类里面

1645180838144-08b07f37-60eb-4331-af93-04da2655dbd8.png

$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有点超知识点,关于反序列化的。

  • 实例白盒-ZZCMS-IP记录功能-HTTP头XFF注入
如果在白盒我们应该怎么知道是否接受登录IP呢,可以进行登录尝试。看看会不会限制次数,用什么来记录登录次数。(IP,其他)
IP记录,会记录IP的值来进行限制登录
在admin下里面有一个login.php(提交账号密码),请求给一个logincheck.php进行处理。

1645174403821-9e2ccff0-a45e-48ed-afa5-9b232d5e3fc7.png

关键性函数getip():$ip=getip();获取IP地址
关键性执行函数:$sqln="select * from zzcms_login_times where ip='$ip'";
有记录IP的函数,这样就会进行数据库操作

1645176134457-bdbb70a0-8f44-4f87-b5e5-26aa55a04b7d.png

对getip()进行进一步跟踪,转到声明地方

1645176338339-1fbc9c7f-e523-40be-81ac-994d706874cb.png

关键接受:if (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown")) 
$ip = getenv("HTTP_X_FORWARDED_FOR"); 
这个可以在数据包上构造,就是X-FORWARDED-FOR:8.8.8.8
这个接受IP并没有过滤,那么可以抓包,进行登录,请求,用X-FORWARDED-FOR:8.8.8.8进行代入注入。
构造payload:X-Forwarded-For:1.2.6.4'union select 1,2,3,4#

1645178497838-83fd696c-1854-42e5-baea-c3ade73bb5dc.png

进行数据库监控,发现关键语句:
select * from zzcms_login_times where ip='1.2.6.4'union select 1,2,3,4#' and count>=5 and unix_timestamp()-unix_timestamp(sendtime)<900

1645178546628-438052e3-2b89-4159-b9d9-01289112d1d7.png

也可以进行保存数据包,然后进行sqlmap进行注入。
posted @ 2023-09-12 13:32  解放者-cracer  阅读(290)  评论(0编辑  收藏  举报