آموزش نوشتن Admin Page Finder ( صفحه مدیریت سایت ) با پایتون

سلام، وقتتون بخیر. امروز میخوایم یه برنامه ساده ولی کاربردی توی پایتون رو با هم یاد بگیریم. میدونیم که معمولا سایت ها یک صفحه برای ورود مدیر دارن. حالا هر سایتی بسته به عوامل مختلف، اسم های متفاوتی برای این صفحه داره. مثلا ممکنه باشه admin.php یا مثلا اگه سایت با وردپرس نوشته شده باشه بصورت پیش فرض فک کنم wp-admin باشه. حالا ما میخوایم یه برنامه بنویسیم که اسم یک سایت رو بگیره و آدرس صفحه ورود مدیر رو برگردونه.

دوره های شبکه، برنامه نویسی، مجازی سازی، امنیت، نفوذ و ... با برترین های ایران
سرفصل های این مطلب
  1. الگوریتم حل مساله

الگوریتم حل مساله

اولین چیزی که بهش نیاز داریم یک جور دیکشنری است. معمولا برای پیدا کردن رمز های عبور و مواردی مثل این از یک دیکشنری شامل لیست زیادی از حالات ممکن استفاده میشه. مثلا برای همون پیدا کردن رمز عبور، یک دیکشنری میتونه شامل هزاران رمز عبور معمول که اکثر مردم استفاده میکنن باشه، مثلا 123 ، 321 ، qazwsx و چیزایی مثل این.

حالا اینجا ما هم یک دیکشنری نیاز داریم که تعداد زیادی حالات ممکن برای اسم یک صفحه ورود ادمین به سایت رو داشته باشه. مثلا admin.php ،login.php ،admin.html و خیلی چیزای دیگه. توی این مساله ما میایم اسم یک سایت رو از کاربر میگیریم و توی یک متغیر ذخیره میکنیم. اون فایل دیکشنری رو با یک حلقه، خط به خط میخونیم، هر حالت ممکن توی فایل دیکشنری تو یه خط جدا نوشته شده. توی هر بار اجرا شدن حلقه، خطی رو که از دیکشنری خوندیم رو کنار متغیری که اسم سایت رو نگه میداره میچسبونیم، یعنی یک url میسازیم. مثلا متغیر محتواش tosinso.com هستش.

تو یک بار اجرای حلقه آدرس مثلا tosinso.com//admin.php ساخته میشه. توی اجرای بعدی حلقه آدرس مثلا tosinso.com//login-admin.asp ساخته میشه و به همین ترتیب تا آخر حلقه که خوندن فایل تموم میشه. توی هر بار اجرای حلقه پس از درست شدن این آدرس های ممکن برای صفحه مدیر، درخواستی برای باز شدن اون صفحه ارسال میشه. این کار رو با استفاده از کتابخونه request در پایتون انجام میدیم. ممکنه اون آدرس درخواستی وجود داشته باشه یا نداشته باشه. اینو با استفاده از header های بسته های http میفهمیم.

حتما خطای 404 رو دیدید. این عدد اگه توی header بازگشتی از سمت سرور باشه یعنی صفحه درخواستی وجود نداره. از این اعداد زیاد هستن و فک میکنم همه اونایی که با 400 شروع بشن به منزله خطا هستن. 200 به معنی وجود صفحه مورد نظر هستش، یعنی اگه توی header بسته بازگشتی از سمت سرور عدد 200 باشه یعنی صفحه مورد نظر وجود داره. این بررسی header رو با یک if انجام میدیم. اگه 200 بود، آدرس رو چاپ کن در غیر اینصورت کاری نمیکنه و میره حلقه رو ادامه میده. منطق برنامه بسیار سادس.

#!/usr/bin/python
import requests
from urllib2 import Request
var = raw_input("Enter the address of target then press [ENTER]: ")

dic_file = open("dictionary.txt","r")
for aline in dic_file.readlines():
	tmp = aline.split()
	url = var+tmp[0]
	req = requests.head(url)
	if req.status_code == 200 :
		print (url)
dic_file.close()
exit()

دستور raw-input که یک رشته رو توی خروجی چاپ میکنه و منتظر میمونه تا کاربر مقداری رو وارد کنه. سپس مقدار ورودی کاربر رو توی متغیر var میریزه. با دستور open فایل رو باز کردیم. اون r از read میاد یعنی فقط قراره فایل خونده بشه. باز شه فایل رو توی متغیر dic__file میریزه. بعدش با یک for فایل رو خط به خط خوندیم. 2 خط اول حلقه for خطوط فایل رو از هم جدا میکنه و url رو میسازه. tmp شامل خطوط فایل و var هم که شامل اسم سایته. با + اینا رو به هم میچسبونیم. سپس درخواستی رو با این url ارسال میکنیم. اگر header بسته بازگشتی شامل 200 بود یعنی صفحه وجود داره و چاپش میکنیم.این برنامه رو یه جور دیگه با کمی تغییرات میشه نوشت، ولی منطقش همینه.

#!/usr/bin/env python
from urllib2 import Request, urlopen, URLError, HTTPError

var = raw_input("Enter the address of target then press [ENTER]: ")

dic_file = open("dictionary.txt","r")
for aline in dic_file.readlines():
	tmp = aline.split()
	url = var+tmp[0]
	req = Request(url)
	try:
		response = urlopen(req)
	except HTTPError as e:
		continue
	except URLError as e:
		continue
	else:
		print (url)

نظرات