Day5
示例代码:
1 | import javax.servlet.http.HttpServletRequest; |
看了半天也没发现哪里有问题,看了下提示,这个题是StringBuilder()引发的dos,大致原因是java.util.StringBuilder
中,StringBuilder对象使用大小为16的数组初始化。每次附加新值时,StringBuilder实例都会检查数据是否适合该数组。如果不合适,则数组的大小加倍。而默认情况下,Apache Tomcat的POST请求限制为2MB,最大参数为10000。将传入的delim值结合数组和多个(例如10000个)HTTP参数提交非常大的参数值(例如1.8 MB),便会引起dos攻击。
了解了漏洞原因再看这段代码就比较容易了,方法toString将收到的所有参数,进行遍历,转化为html格式。
直接写个脚本,注意先不要把参数写那么大,,,要不可能执行脚本的时候卡掉。。。慢慢的值改上去。
python写个脚本:
1 | headers = {} |
当参数的值一调大以后,python脚本就报这个问题,google查了半天,发现在requests库下也有好多人提交了这个问题,也没找到合适的解决方案,不过思路应该没错。
1 | requests.exceptions.ConnectionError: ('Connection aborted.', BrokenPipeError(32, 'Broken pipe')) |
Day6
示例代码:
1 | import java.io.*; |
刚开始以为是个文件遍历,仔细一看,没有对文件进行显示,返回“文件未找到”。
原来又是一个dos。。。传入/dev/urandom,此时url对传入的值未进行任何过滤,通过Files.readAllBytes方法读取/dev/urandom下的字节,引起dos
Day7
示例代码:
1 | import com.fasterxml.jackson.core.*; |
大致流程为用户传入username的值,写入到/tmp/getUserInformation.json
中,然后读取该文件,进行解析。 流程很简单,肯定先关注用户输入地方,对username
传入的数据未做清洗,导致可传入其他参数进行污染,在该功能下可导致权限提升。
先正常请求,返回如下:
此时json文件为:
1 | { |
构造恶意请求,
1 | username=111111111","permission":"all |
可看到用户传入username的值已正确解析成username=111111111","permission":"all
此时json文件为:
1 | "username":"111111111" |
注:若要成功利用此问题,该方法loadJson()必须仅反序列化每个键的第一次出现,以便忽略重复的键。
Day8
示例代码:
1 | import java.io.File; |
看到两个输入点,icons
、filename
均未做任何过滤,用户传入数这两个参数后,对其名字做判断,其中判断使用的是getName()
方法,该方法仅能做简单../
的过滤,如/../../../../hack.txt
转成hack.txt
。然后执行到关键代码String toDir = "/var/myapp/data/" + f_icons.getName() + "/";
,发现toDir的值为/var/myapp/data/
与f_icons.getName()
拼接而成。此时通过../
的形式对传入的值做控制,从而实现可以访问/var/myapp/
目录下任意文件。
稍微修改代码,让程序跑起来。执行恶意payload,