چطور با پایتون یک برنامه Admin Page Finder ساده بنویسیم؟

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

چطور با پایتون یک برنامه Admin Page Finder ساده بنویسیم؟

حالا ما میخواهیم یه برنامه بنویسیم که اسم یک سایت رو بگیره و آدرس صفحه ورود مدیر رو برگردونه. الگوریتم حل مساله اولین چیزی که بهش نیاز داریم یک جور دیکشنری است. معمولا برای پیدا کردن رمز های عبور و مواردی مثل این از یک دیکشنری شامل لیست زیادی از حالات ممکن استفاده میشه. مثلا برای همون پیدا کردن رمز عبور، یک دیکشنری میتونه شامل هزاران رمز عبور معمول که اکثر مردم استفاده میکنن باشه، مثلا 123 ، 321 ، qazwsx و چیزایی مثل این. حالا اینجا ما هم یک دیکشنری نیاز داریم که تعداد زیادی حالات ممکن برای اسم یک صفحه ورود ادمین به سایت رو داشته باشه. مثلا admin.php ،login.php ،admin.html و خیلی چیزای دیگه. توی این مساله ما میایم اسم یک سایت رو از کاربر میگیریم و توی یک متغیر ذخیره میکنیم. اون فایل دیکشنری رو با یک حلقه، خط به خط میخونیم، هر حالت ممکن توی فایل دیکشنری تو یه خط جدا نوشته شده. توی هر بار اجرا شدن حلقه، خطی رو که از دیکشنری خوندیم رو کنار متغیری که اسم سایت رو نگه میداره میچسبونیم، یعنی یک url میسازیم. مثلا متغیر محتواش cmsarya.ir هستش. تو یک بار اجرای حلقه آدرس مثلا cmsarya.ir/admin.php ساخته میشه. توی اجرای بعدی حلقه آدرس مثلا cmsarya.ir/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 بود یعنی صفحه وجود داره و چاپش میکنیم.

این برنامه رو یه جور دیگه با کمی تغییرات میشه نوشت، ولی منطقش همینه.

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)

لینک منبع