Target: log in as the administrator
and delete carlos
.
1、防止API漏洞
在设计API时,确保在一开始就考虑到安全性
要确保:
2、服务器端参数污染
当网站将用户输入嵌入到服务器端请求中,而没有进行适当的编码时,就会发生服务器端参数污染。这意味着攻击者可能能够操纵或注入参数,这可能使他们能够,例如:
您可以测试任何用户输入的任何类型的参数污染。例如,查询参数、表单字段、标头和URL路径参数都可能容易受到攻击。
3、测试查询字符串中的服务器端参数污染
在输入中放置像#、&和=这样的查询语法字符,并观察应用程序如何响应。
考虑存在以下场景 :
应用程序允许根据用户名搜索其他用户。当你搜索一个用户时,你的浏览器会发出以下请求:
GET /userSearch?name=peter&back=/home
为了检索用户信息,服务器用以下请求查询一个内部API:
GET /users/search?name=peter&publicProfile=true
4、截断查询字符串
可以使用url编码的#字符尝试截断服务器端请求。
为了帮助您解析响应,您还可以在#字符之后添加一个字符串。
例如,您可以将查询字符串修改如下:
GET /userSearch?name=peter%23foo&back=/home
前端将尝试访问以下URL:
GET /users/search?name=peter#foo&publicProfile=true
注:
必须对#字符进行url编码。否则前端应用程序会将其解释为片段标识符,而不会传递给内部API。
查看响应,寻找查询是否被截断的线索。
例如,如果响应返回用户peter,则服务器端查询可能已被截断。
如果返回Invalid name错误消息,则应用程序可能已将foo视为用户名的一部分。
这表明服务器端请求可能没有被截断。
如果您能够截断服务器端请求,那么就不需要将publicProfile字段设置为true。您可以利用这一点来返回非公共用户配置文件。
5、注入无效参数
可以使用url编码的&字符来尝试向服务器端请求添加第二个参数。
例如,您可以将查询字符串修改如下:
GET /userSearch?name=peter%26foo=xyz&back=/home
这会导致以下服务器端对内部API的请求:
GET /users/search?name=peter&foo=xyz&publicProfile=true
查看响应以获取有关如何解析附加参数的线索。
例如,如果响应没有改变,这可能表明参数被成功注入,但被应用程序忽略了。
为了建立一个更完整的图像,您需要进一步测试。
6、注入有效参数
如果能够修改查询字符串,那么可以尝试向服务器端请求添加第二个有效参数。
有关如何识别可以注入查询字符串的参数的信息,请参阅查找隐藏参数一节。
例如,如果您已经确定了email参数,您可以将其添加到查询字符串中,如下所示:
G