1.漏洞復現(xiàn)
PbootCMS 3.0.4,下載倉庫 · 星夢/PbootCMS - Gitee.com
復現(xiàn)
漏洞頁面:http://127.0.0.1/?search 或 http://127.0.0.1/?keyword
POST請求:1=select 1
2.正向分析
從可見功能點正向分析
index.php
...
//?引用內(nèi)核啟動文件
require?dirname(__FILE__)?.?'/core/start.php';
/core/start.php
...
//?啟動內(nèi)核
core\basic\Kernel::run();
/core/basic/Kernel.php
加密了,之后調(diào)用 IndexController類 的 _empty方法
...
*??翱云科技版權所有,未經(jīng)許可擅自破解本文件將依法追究法律責任。
...
/apps/home/controller/IndexController.php
在 _empty方法 的開頭添加:
//?空攔截器,?實現(xiàn)文章路由轉發(fā)
public?function?_empty()
{
??var_dump(debug_backtrace());
訪問主頁,可以知道是 Kernel.php 調(diào)用的
array(4)?{
??[0]=>
??array(7)?{
????["file"]=>
????string(108)?"D:\environment\phpstudy_pro\WWW\PbootCMS-V3.0.4\core\basic\Kernel.php(10)?:?eval()'d?code(1)?:?eval()'d?code"
????["line"]=>
????int(2)
通過對 search 或 keyword 進行 GET請求 都可以調(diào)用 SearchController類 的 index方法
//?空攔截器,?實現(xiàn)文章路由轉發(fā)
public?function?_empty()
{??...
??//?路由
??switch?($param[0])?{
????case?'search':
????case?'keyword':
??????$search?=?new?SearchController();
??????$search->index();
??????break;
/apps/home/controller/SearchController.php
調(diào)用了 ParserController類 的 parserSearchLabel方法
class?SearchController?extends?Controller
{
??...
??public?function?__construct()
??{
????$this->parser?=?new?ParserController();
????...
??}
??...
??public?function?index()
??{
????...
????$content?=?$this->parser->parserSearchLabel($content);?//?搜索結果標簽
ParserController類
/apps/home/controller/ParserController.php
class?ParserController?extends?Controller
{
??...
??public?function?__construct()
??{
????$this->model?=?new?ParserModel();
??}
??...
??//?解析內(nèi)容搜索結果標簽
??public?function?parserSearchLabel($content)
??{
????...
????//?數(shù)據(jù)接收
????if?($_POST)?{
??????$receive?=?$_POST;
????}?else?{
??????$receive?=?$_GET;
????}
?
????foreach?($receive?as?$key?=>?$value)?{
??????if?(!?!?$value?=?request($key,?'vars'))?{
????????...
????????$where3[$key]?=?$value;
????????...
??????}
????}
?
????//?去除特殊鍵值
????unset($where3['keyword']);
????...
????$data?=?$this->model->getLists($scode,?$num,?$order,?$where1,?$where2,?$where3,?$fuzzy,?$start,?$lfield,?$lg);
頁面中的搜索框是對 keyword 進行 GET請求 的,但是如果用 keyword 請求,變量會被銷毀
所以要自己進行 POST請求(1=select 1),請求會被 request函數(shù) 處理后賦值給 $where3,然后處理 SQL語句
/core/function/helper.php
request函數(shù)
function?request($name,?$type?=?null,?$require?=?false,?$vartext?=?null,?$default?=?null)
{
??if?(isset($_POST[$name]))?{
????$d_source?=?'post';
??}?else?{
????$d_source?=?'get';
??}
??$condition?=?array(
????'d_source'?=>?$d_source,
????'d_type'?=>?$type,
????'d_require'?=>?$require,
????$name?=>?$vartext,
????'d_default'?=>?$default
?
??);
??return?filter($name,?$condition);
}
設置了一個數(shù)組,然后通過 filter函數(shù) 進行過濾
array(5)?{
??["d_source"]=>
??string(4)?"post"
??["d_type"]=>
??string(4)?"vars"
??["d_require"]=>
??bool(false)
??[1]=>
??NULL
??["d_default"]=>
??NULL
}
filter函數(shù)
function?filter($varname,?$condition)
{
??...
??$vartext?=?$varname;
??...
??//?數(shù)據(jù)源
??if?(array_key_exists('d_source',?$condition))?{
????switch?($condition['d_source'])?{
??????case?'post':
????????$data?=?@$_POST[$varname];
????????break;
??...
??//?數(shù)據(jù)類型檢測
??if?(array_key_exists('d_type',?$condition))?{
????switch?($condition['d_type'])?{
??????...
??????case?'vars':
????????if?(!?preg_match('/^[\x{4e00}-\x{9fa5}\w\-\.,\s]+$/u',?$data))?{
??????????$err?=?'只能包含中文、字母、數(shù)字、橫線、點、逗號、空格!';
????????}
????????break;
??...
??//?返回收據(jù)
??return?escape_string($data);
}
就是,并且data 只能包含中文、字母、數(shù)字、橫線、點、逗號、空格,然后通過 escape_string函數(shù) 進行過濾
/core/function/handle.php
escape_string函數(shù)
Copy
//?獲取轉義數(shù)據(jù),支持字符串、數(shù)組、對象
function?escape_string($string)
{
??...
??$string?=?htmlspecialchars(trim($string),?ENT_QUOTES,?'UTF-8');
??$string?=?addslashes($string);
??...
??return?$string;
}
對 select 1 用 htmlspecialchars函數(shù) 和 addslashes函數(shù) 進行了轉義
ParserModel類
/apps/home/model/ParserModel.php
getLists方法
數(shù)據(jù)過濾完之后通過 ParserModel類 的 getLists方法 處理 SQL語句
//?列表內(nèi)容,帶分頁,不區(qū)分語言,兼容跨語言
public?function?getLists($scode,?$num,?$order,?$filter?=?array(),?$tags?=?array(),?$select?=?array(),?$fuzzy?=?true,?$start?=?1,?$lfield?=?null,?$lg?=?null)
{
??...
??return?parent::table('ay_content?a')->field($fields)
????...
????->where($select,?'AND',?'AND',?$fuzzy)
????...;
}
就在select數(shù)組 中,通過 where方法 進行了 SQL語句 拼接操作
Model類
/core/basic/Model.php
where方法
在 return 上面添加,看看最終的 SQL語句 是什么:
final?public?function?where($where,?$inConnect?=?'AND',?$outConnect?=?'AND',?$fuzzy?=?false)
{
??...
??var_dump($this->sql['where']);
??return?$this;
}
看到注入的 SQL語句 拼接到了最后文章來源:http://www.zghlxwxcb.cn/news/detail-683316.html
string(143)?"WHERE(a.scode?in?('5','6','7')?OR?a.subscode='5')?AND(a.status=1?AND?d.type=2?AND?a.date<'2023-05-05?14:09:11'?AND?a.acode='cn'?)?AND(select?1)"
本文為免殺三期學員筆記:https://www.cnblogs.com/Night-Tac/articles/17372836.html文章來源地址http://www.zghlxwxcb.cn/news/detail-683316.html
到了這里,關于PbootCMS 3.0.4 SQL注入的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!