前言

今年的青少赛线下多了很多有质量的题目,在第一天的创新赛中,也第一次引入了一些新形势的东西,比如近源渗透中WIFI密码破解、服务器密码破解甚至M1卡(大华梯控的分析与修改等),这些东西确实很棒。不过,今天我们还是来先说说AWDP模式中的问题和技巧进行复盘。

AWDP - Web ezdja

这是一道DJango的题目,正好前两天研究了一下DJango的开发,所以这道题目修补的很快,得心应手。

这是题目的目录环境,我暂时没有复现该环境,其实也可以说,这次的复盘是根据防守方进行复盘的。

我们使用VScode对代码环境进行查看和编辑。

在app01目录中,我们可以找到一个很抽象的脚本,myfunc.py

在其中的52-71行,也很抽象的定义了两个waf方法,那么第一个waf就是防护sql注入的。

我们使用VScode进行全局搜索,搜索一下哪些地方使用了waf方法:

发现是在views.py中,对登录的用户名的检测位置,使用了waf函数。那么大家看到这里的时间就会想,那这题目的登录、注册两个功能,为什么没用呢?

通过上图,我们可以看到,对数据库进行操作的语句,其实是一个对象操作:

1
User.objects.filter(username=username, haha_p433w0rd=password)

基本上不会存在注入,而存在注入的点是什么呢?

其实只有在浏览页面的时候传入的session中username字段,其实我在挖掘的时候也正是没有看到这个点,而想着是不是在登录的地方有sql注入呢?

那么修补办法,就是对waf函数进行增强。

1
2
3
4
5
6
7
def waf(sql):
blacklists = ["union select", "sleep", "benchmark","columns","load_file","local","outfile","dumpfile","file"]
for blacklist in blacklists:
if blacklist in sql:
print(blacklist)
return False
return True

我们可以看到,原来的waf函数过滤的很抽象,为什么这么说呢?因为他只过滤这些内容了,我们甚至能通过sqlmap进行注入。

于是我根据php的通防脚本(后面会给大家)修改,套了一下就成功防御了。

1
2
3
4
5
6
7
8
def waf(sql):
blacklists = ["union select", "sleep", "benchmark","columns","load_file","local","outfile","dumpfile","file","union","select",
"select","and","*","x09","x0a","x0b","x0c","x0d","xa0","x00","x26","x7c","or","into","from","where","join","sleexml","extractvalue","+","regex","copy","read","file","create","grand","dir","insert","link","server","drop","=",">","<",";"]
for blacklist in blacklists:
if blacklist in sql:
print(blacklist)
return False
return True

AWDP - Web found_cms

这道题其实在做题的时候我是有点懵逼的,但是现在复盘一下,又恍然大悟了。

AWDP - easygo

我个人没有什么pwn经验,所以后续要努力学Pwn了。

使用IDA64打开文件,进行分析。

跟着程序流程走,发现下图的main_backdoor

追踪,发现cat /flag和/bin/bash的调用。

既然是AWDP,我们不难想象出官方的EXP和我们应该如何修补。

我的解决办法呢,就是修补这个位置:

点击cat /flag,对cat flag进行修改。

修改为

这样就无法通过原exp获取到flag了

接着写出文件,保存,然后放到服务器上更新即可。

附件 - PHP通防

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function wafrce($str){
return !preg_match("/openlog|syslog|readlink|symlink|popepassthru|stream_socket_server|scandir|assert|pcntl_exec|fwrite|curl|system|eval|assert|flag|passthru|exec|chroot|chgrp|chown|shell_exec|proc_open|proc_get_status|popen|ini_alter|ini_restore/i", $str);
}

function wafsqli($str){
return !preg_match("/select|and|\*|\x09|\x0a|\x0b|\x0c|\x0d|\xa0|\x00|\x26|\x7c|or|into|from|where|join|sleexml|extractvalue|+|regex|copy|read|file|create|grand|dir|insert|link|server|drop|=|>|<|;|\"|\'|\^|\|/i", $str);
}

function wafxss($str){
return !preg_match("/\'|http|\"|\`|cookie|<|>|script/i", $str);
}


function waf($s){
if (preg_match("/select|flag|union|\\$|'|"|--|#|\0|into|alert|img|prompt|set|/*|x09|x0a|x0b|x0c|x0d|xa0|%|<|>|^|x00|#|x23|[0-9]|file|=|or|x7c|select|and|flag|into|where|x26|'|"|union|`|sleep|benchmark|regexp|from|count|procedure|and|ascii|substr|substring|left|right|union|if|case|pow|exp|order|sleep|benchmark|into|load|outfile|dumpfile|load_file|join|show|select|update|set|concat|delete|alter|insert|create|union|or|drop|not|for|join|is|between|group_concat|like|where|user|ascii|greatest|mid|substr|left|right|char|hex|ord|case|limit|conv|table|mysql_history|flag|count|rpad|&|*|.|/is",$s)||strlen($s)>50){
header("Location: /");
die();
}
}