最近看了下tpshop,審計出幾個雞肋的漏洞,這個SQL注入漏洞是其中之一。然后審計完網(wǎng)上搜了一下發(fā)現(xiàn)有一堆后臺的sql注入漏洞,應(yīng)該是覺得后臺的SQL不用修叭(我個人是可以理解的)。
創(chuàng)新互聯(lián)公司主營企業(yè)營銷型網(wǎng)站建設(shè),為眾多企業(yè)提供了高端網(wǎng)站設(shè)計服務(wù),建網(wǎng)站哪家好?擁有多年的營銷型網(wǎng)站流程,能夠?yàn)槠髽I(yè)定制化制作網(wǎng)站服務(wù),在公司網(wǎng)站建設(shè)維護(hù)方面成績突出。
首先要登錄后臺,這也是我說漏洞很雞肋的原因。
漏洞位于在后臺的商城-》文章->文章列表處的搜索
抓包,存在漏洞的參數(shù)是keywords,當(dāng)輸入payload' or length(database())=10)#
時,頁面返回文章數(shù)0,
而當(dāng)輸入payload' or length(database())=9)#
時,頁面返回為共33篇文章(總共33篇,數(shù)據(jù)庫名是tpshop2.0)
因此可以通過布爾注入來獲取數(shù)據(jù)庫信息,當(dāng)然延時也可以,只不過我自己是能不用延時就不用延時的人。
分析下代碼,原因很簡單,where直接拼接了。并且會將查詢到的結(jié)果返回到頁面中。application/admin/controller/Article.php:56
$keywords = trim(I('keywords'));
$keywords && $where.=" and title like '%$keywords%' ";
$cat_id = I('cat_id',0);
$cat_id && $where.=" and cat_id = $cat_id ";
$res = $Article->where($where)->order('article_id desc')->page("$p,$size")->select();
$count = $Article->where($where)->count();// 查詢滿足要求的總記錄數(shù)
$pager = new Page($count,$size);// 實(shí)例化分頁類 傳入總記錄數(shù)和每頁顯示的記錄數(shù)
//$page = $pager->show();//分頁顯示輸出
$ArticleCat = new ArticleCatLogic();
$cats = $ArticleCat->article_cat_list(0,0,false);
if($res){
foreach ($res as $val){
$val['category'] = $cats[$val['cat_id']]['cat_name'];
$val['add_time'] = date('Y-m-d H:i:s',$val['add_time']);
$list[] = $val;
}
}
$this->assign('cats',$cats);
$this->assign('cat_id',$cat_id);
$this->assign('list',$list);// 賦值數(shù)據(jù)集
$this->assign('pager',$pager);// 賦值分頁輸出
return $this->fetch('articleList');
最后執(zhí)行的sql語句為:
我在用payload的時候用的是=,是因?yàn)檩斎胱隽诉^濾,會轉(zhuǎn)義> <,用大于號不能直接執(zhí)行sql,會報錯。